// Скетч для управления периферией RTL-SDR-приемника // // Скетч написан примитивно и с коментариями. Задача - упростить понимание и дать возможность модифицировать его начинающим. // Правильный код обычно так не пишется, ногами не пинать! // // Назначение цифровых контактов: // - с 4 по 9 - будут выдавать напряжение на включение соответсвующего диапазонного фильтра (1.8, 3.5, 7, 14, 21, 28) // - 10 - включение предусилителя (МШУ) // - 11 - включение аттенюатора // - 12 - сервопривод на вращение оси КПЕ входного контура (в случае решения от US5MQ) // - 13 - сервопривод на вращение потенциометра плавной регилировки входного уровня сигнала (или еще одного КПЕ рамочной антенны) // // Принятая система команд: // Команды переключения диапазонных фильтров: // Цифры - от 11 до 16 - соотвественно включают ДПФ (1.8, 3.5, 7, 14, 21, 28) // В один момент времени активным может быть только один ДПФ // // 21/22 - Команда включения/выключения предусилителя (МШУ): // 31/32 - Команда на включение/выключение аттенюатора: // // Команда на вращение оси КПЕ входного контура (в случае решения от US5MQ) // Цифры - от 100 до 199 - устанавливают % поворота ротора конденсатора (100 - минимальная емкость, 199 - максимальная емкость) // Команда на вращение потенциометра плавной регилировки входного уровня сигнала (или еще одного КПЕ рамочной антенны) // Цифры - от 200 до 299 - устанавливают % поворота ротора конденсатора/потенциометра (200 - минимум, 299 - максимум) // // В конце каждой команды идет символ "@" // подключаем библиотеку управления сервоприводами #include // создаем объекты для двух сервоприводов Servo myservo1; Servo myservo2; // строковая переменная, для приема текста от компьютера String command = ""; // цифровой код полученной от компьютера команды int Cmd; // временные переменные int i; void setup() { // инициализируем выводы для сервоприводов myservo1.attach(12); myservo2.attach(13); // выставляем сервоприводы в положение максимума, для того, чтобы пластины КПЕ не висели в воздухе и их нельзя было случайно погнуть myservo1.write(180); myservo2.write(180); // устанавливаем скорость соединения последовательного порта Serial.begin(9600); // инициализируем цифровые выходы и устанавливаем на них "низкое" значение уровня сигнала for ( i = 4; i <= 11; i++) { pinMode(i, OUTPUT); digitalWrite(i, LOW); } } void loop() { while (Serial.available() > 0) { //если есть доступные данные char inChar = Serial.read(); //считываем байт command += inChar; //собираем информацию в строку delay(1); if (inChar == '@') { //если пришел символ "собака", значит пора выполнять команду Cmd = command.toInt(); // далее идет примитивный код, расчитанный на то, что его смогут модифицировать начинающие (код не красивый и обычно так не пишут) // включаем/выключаем предусилитель (МШУ) if (Cmd == 21) { digitalWrite(10, HIGH); } if (Cmd == 22) { digitalWrite(10, LOW); } // включаем/выключаем аттенюатор if (Cmd == 31) { digitalWrite(11, HIGH); } if (Cmd == 32) { digitalWrite(11, LOW); } // отключаем все и включаем только выбранный ДПФ if ( (Cmd >= 11) and (Cmd <= 16)) { for ( i = 4; i <= 9; i++) { digitalWrite(i, LOW); } digitalWrite((Cmd-10+3), HIGH); } // управляем первым сервоприводом if ( (Cmd >= 100) and (Cmd <= 199)) { myservo1.write(round((Cmd-100)*1.8)); } // управляем вторым сервоприводом if ( (Cmd >= 200) and (Cmd <= 299)) { myservo2.write(round((Cmd-200)*1.8)); } // команды закончились command = ""; //обнуляем переменную содержащую принятую от компьютера строку } } }