Исходные данные:

РД Stinger S650 - две управляющие кнопки (выбор режимов, навигация по меню и т.п.), потенциометр регулировки громкости (он же включение/выключение), разъем внешнего питания.

Задача:

Скрытый монтаж в салоне. Т.е. доступа к управлению нет, цифровой индикатор вынесен, корпус выкинут и т.п. Система завязана на карписю. Включаться должна вместе с ним, при подаче АСС, так же должна быть возможность вырубить ее в любой момент, не выключая при этом комп (ну и естественно - не глуша двигатель).

Ньюансы:

К сожалению, зверушка имеет одну неприятную особенность - при включении запускается режим самотестирования, сопровождающийся писком, визгом и радостными сообщениями о пойманных якобы радарах во всех диапазонах. Отключается только ручками, и делать это надо каждый раз при подаче питания (или терпеть...)

Воплощение:

Собран макет. Схема в принципе понятна из листинга: к цифровым выходам подключены управляющие входы сильноточных (других под рукой не оказалось) оптронов, выходы двух из которых будут замыкать контакты управляющих кнопок РД, выход третьего - коммутировать 12 V питания на него. Чтобы не париться с короткими/длинными нажатиями, в интерфейсе управления планируется сделать отдельные кнопки на каждый тип нажатия (т.е. с учетом кнопки питания - 5 штук пока).

В этой редакции проги не учтена пока еще необходимость регулировки уровня звука (откровенно забыл про это ), и самое главное - ввиду непонимания пока как именно будет организовано плечо "комп-ардуина" - управление идет не по COM-порту, а замыканием на питание управляющих входов контроллера...

PHP код:
/*
  Пять кнопок: 
  Вкл/Выкл питания нагрузки
  Режим 1 (короткое нажатие)
  Режим 1 (длинное нажатие)
  Режим 2 (короткое нажатие)
  Режим 2 (длинное нажатие)
 
 Питание на нагрузку подается либо при начальной инициализации системы, 
 либо программно (для вкл/выкл нагрузки без снятия питания со всей системы)
 По включению питания формируется импульс сброса самотестирования нагрузки. 
 
 
 The circuit:
 * Оптрон Режима 1  attached from pin 9 to ground 
 * Оптрон Режима 2  attached from pin 11 to ground
 * Оптрон Вкл/Выкл  attached from pin 7 to ground
 * Иммитация короткого нажатия режима 1 attached to pin 2 from +5V
 * 10K resistor attached to pin 2 from ground
 * Иммитация длинного нажатия режима 1 attached to pin 3 from +5V
 * 10K resistor attached to pin 2 from ground
 * Иммитация короткого нажатия режима 2 attached to pin 4 from +5V
 * 10K resistor attached to pin 4 from ground
 * Иммитация длинного нажатия режима 2 attached to pin 5 from +5V
 * 10K resistor attached to pin 5 from ground
 * pin 8 attached to pin 11   
 * pin 7 attached to pin 12
  
  ******************
 modified 22.01.2010
  */

// constants won't change. They're used here to 
// set pin numbers:
const int buttonPin1 12;     // Вход с питания
const int buttonPin2 8;     // Вход с формирователя сброса
const int buttonPin3 2;     // Режим 1 короткое нажатие
const int buttonPin4 3;     // Режим 1 длинное нажатие
const int buttonPin5 4;     // Режим 2 короткое нажатие
const int buttonPin6 5;     // Режим 2 длинное нажатие
const int buttonPin7 6;     // Включение/выключение питания
const int ledPin4 =  9;       // Управление 1 режимом
const int ledPin5 =  11;      // Управление 2 режимом/Ипульс сброса теста
const int ledPin2 =  7;      // Включение нагрузки



// variables will change:
int buttonState 0;         // variable for reading the pushbutton status

void setup() {
  
// initialize the LED pin as an output:
  
pinMode(ledPin2OUTPUT);
  
pinMode(ledPin4OUTPUT); 
  
pinMode(ledPin5OUTPUT);
    
// initialize the pushbutton pin as an input:
  
pinMode(buttonPin1INPUT);
  
pinMode(buttonPin2INPUT);
  
pinMode(buttonPin3INPUT);  
  
pinMode(buttonPin4INPUT);
  
pinMode(buttonPin5INPUT);  
  
pinMode(buttonPin6INPUT);
  
pinMode(buttonPin7INPUT);

    
// turn LED on:    
    
digitalWrite(ledPin2HIGH); // Первое включение системы
   
  // read the state of the pushbutton value:
  
buttonState digitalRead(buttonPin1);

  
// check if the pushbutton is pressed.
  // Если питание подано, формируется импульс сброса с задержкой 2 сек:
  
if (buttonState == HIGH) {     
    
// turn LED on: 
   
delay(2000);                  // пауза на сброс теста for a 2 second 
    
digitalWrite(ledPin5HIGH); // Импульс сброса 2 сек 
   
delay(1000);  
  } 
  else {
  }
}

void loop() {
  
// Если нагрузка уже инициалирована, переход в рабочую программу
  
while (digitalRead(buttonPin1) == HIGH) {
     
work(); 
   }
    
// Если нагрузка не инициалирована, переход в инициализацию
  
while (digitalRead(buttonPin1) == LOW) {
     
initial(); 
   }
}
void initial(){   
  
delay(1000);                  // пауза на включение
   // Выбор режима Вкл/Выкл:
  
buttonState digitalRead(buttonPin7);
  
  
// check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  
if (buttonState == HIGH) {     
    
// turn LED on:    
    
digitalWrite(ledPin2HIGH); // Включение питания
     

  else {
      }
  
// read the state of the pushbutton value:
  
buttonState digitalRead(buttonPin1);

  
// check if the pushbutton is pressed.
  // Если питание подано, формируется импульс сброса с задержкой 2 сек:
  
if (buttonState == HIGH) {     
    
// turn LED on: 
   
delay(2000);                  // пауза на сброс теста for a 2 second 
    
digitalWrite(ledPin5HIGH); // Импульс сброса 2 сек 
   
delay(1000);  
  } 
  else {
  }

   
// Если импульс сброса сформирован, переход к рабочему циклу
   
while (digitalRead(buttonPin2) == HIGH) {
     
work(); 
   }
}

void work(){
  
digitalWrite(ledPin5LOW); // Снятие импульса сброса
  // Выбор режима 1 короткое/длинное нажатие:
  
buttonState digitalRead(buttonPin3);
  
  
// check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  
if (buttonState == HIGH) {     
    
// turn LED on:    
    
digitalWrite(ledPin4HIGH); 
   
delay(1000);                  // Короткое нажатие (Реж.1)
  
digitalWrite(ledPin4LOW);    // set the LED off 
  

  else {
    
// turn LED off:
    
digitalWrite(ledPin4LOW); 
  }
  
buttonState digitalRead(buttonPin4);
  
  
// check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  
if (buttonState == HIGH) {     
    
// turn LED on:    
    
digitalWrite(ledPin4HIGH); 
   
delay(5000);                  // Длинное нажатие (Реж.1)
  
digitalWrite(ledPin4LOW);    // set the LED off 
  

  else {
    
// turn LED off:
    
digitalWrite(ledPin4LOW); 
  }
  
// Выбор режима 2 короткое/длинное нажатие:
  
buttonState digitalRead(buttonPin5);
  
  
// check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  
if (buttonState == HIGH) {     
    
// turn LED on:    
    
digitalWrite(ledPin5HIGH); 
   
delay(1000);                  // Короткое нажатие (Реж.2)
  
digitalWrite(ledPin5LOW);    // set the LED off 
  

  else {
    
// turn LED off:
    
digitalWrite(ledPin5LOW); 
}
// read the state of the pushbutton value:
  
buttonState digitalRead(buttonPin6);
  
  
// check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  
if (buttonState == HIGH) {     
    
// turn LED on:    
    
digitalWrite(ledPin5HIGH); 
   
delay(5000);                  // Длинное нажатие (Реж.2)
  
digitalWrite(ledPin5LOW);    // set the LED off 
  

  else {
    
// turn LED off:
    
digitalWrite(ledPin5LOW); 
  }
  
  
// Включение/выключение питания:
  
buttonState digitalRead(buttonPin7);
  
  
// check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  
if (buttonState == HIGH) {     
    
// turn LED on:    
    
digitalWrite(ledPin2LOW); 
   
delay(1000);                  // 
  
digitalWrite(ledPin2LOW);    // set the LED off 
  

  else {
  }
  

Задержки и длительности импульсов выставлены на глазок - величины уточню, когда буду вязать сабжи напрямую друг к другу...