хочу собрать машинку управляемую с ик пульта. что касается механики то это я собрал в качестве рулевого механизма использовал серву. а вот программу написать не могу задумка такая при нажатии кнопки в перед серва ставила угол 90 а на транзистор подавался сигнал малого уровня потом нажав другую кнопку которая будет увеличивать сигнал на транзистор. и так 3 передачи а при повороте хотел чтоб серва выворачивалась на 45 или 135 а скорость при этом оставалась заданной а задний ход хотел сделать через рле чтоб сменить полярность на двигателе а задний ход был со стабильным сигналом шим чтоб его раз отрегулировал и все. и еще думал сделать. и свет включать хотелось бы) помогите написать программу. заранее спасибо! я не сильно шарю в программирование если не сложно то можно и подробные пояснения
Шим с реле лучше не испольозовать, ибо реле выйдет из строя. Для управления моторами лучше использовать мотор шилд. он и скорость и направление может задавать по шим.
Вот тут посмотри, я всё подробно описал. P.S. только я не использовал сервы. Ну думаю там проблем с этим не будет)
Код (C): #include <IRremote.h> //импорт библиотеки для ИК приёмника (устанавливается отдельно) int RECV_PIN = 26; //пин подключения ИК приёмника IRrecv irrecv(RECV_PIN); //указываем библиотеке пин подключения ИК приёмника decode_results results; // Какая то хрень для ИК приёмника (декодим коды, так как у нас ИК приёмник, а не ИК передатчик) //--------------------------------------------- // указываю пины для управления двигателям int leftPin = 22; //лева руля int rightPin = 24; //права руля int goPin = 53; //Вперёд!!! int nazadPin = 51; //задний ход int gazPin = 7; //Аналоговый пин для управления мощностью главного двигателя int power = 150; //Значение мощности двигателя (до 255) int led1 = 30; //Эт светодиод (Включить, выключить фары) char command = '0'; //Переменная для обработки команд через Serial соединение int rByte = 0; //Переменная для алгоритма корректной работы serial содинения boolean stateSvet = LOW; //Значение света (true включён false выключен. P.S. LOW==FALSE, HIGH==TRUE эт на заметку) //------------------------------------------------ void setup() //функция настройки, выполняется в самом начале 1 раз { //Устанавливаем выходы pinMode(leftPin, OUTPUT); pinMode(rightPin, OUTPUT); pinMode(goPin, OUTPUT); pinMode(nazadPin, OUTPUT); pinMode(gazPin, OUTPUT); pinMode(led1, OUTPUT); //свет тоже выход)) Serial.begin(9600); // Открываем Serial соединение для обмена данными по USB irrecv.enableIRIn(); // Start the receiver */* для ик приёмника запуск режима приёма } //------------------------------------------------- // функия включения фар. Если выключены, включить, иначе выключить void svet() { if (stateSvet == LOW) stateSvet = HIGH; else stateSvet = LOW; digitalWrite(led1, stateSvet); } //Функция стоп мотор. Чтобы не подавать одновременно 2 сигнала на передний и задний ход. Ну и для остановки void sMotor() { digitalWrite(goPin, LOW); digitalWrite(nazadPin, LOW); } //Функция движения вперёд void go() { sMotor(); //сбрасываем все значения digitalWrite(goPin, HIGH); //подаём нужный сигнал // digitalWrite(led1, HIGH); //Когда то включался свет при движении вперёд } // Функция движения назад void nazad() { sMotor(); digitalWrite(nazadPin, HIGH); // digitalWrite(led1, LOW); //Свет выключить } //Функция стоп руля void sRul() { digitalWrite(leftPin, LOW); digitalWrite(rightPin, LOW); } //лева руля void leftRul() { sRul(); //если до этого куда то поворачивали, то сбросить значение digitalWrite(leftPin, HIGH); //и рулить на лево } void rightRul() { sRul(); digitalWrite(rightPin, HIGH); } //Сценарий разворота влево beta test v0.00.0.0.001 :D void razvorotLeft() { rightRul(); nazad(); delay(500); leftRul(); go(); delay(700); rightRul(); nazad(); delay(100); sMotor(); sRul(); } //=========================================================+++++++++++++++++++++ void loop() //Ну а теперь понеслась //\\//\\//\\ {/* старый метод, теперь он интегрирован в алгоритм ниже if (irrecv.decode(&results)) { Serial.println(results.value, HEX); irrecv.resume(); // Receive the next value }*/ //\\//\\//\\ if (rByte = Serial.available() != 0 || irrecv.decode(&results)) //Если есть данные переданные через USB serial или ИК датчик, то { command = Serial.read(); //читаем команду Serial.println(command); //отсылаем эту команду братно Serial.println(results.value, HEX); //отсылаем код кнопки от ИК приёмника irrecv.resume(); // Receive the next value */* продолжаем работать с ИК приёмником if (command == '2' || results.value == 0xFF22DD) //Если была пришла по Serial COM порту цифра 2 или была нажата кнопка на пульте с кодом FF22DD, значит надо ехать вперёд go(); else if (command == '3' || results.value == 0xFF12ED) //всё аналогично, команда, выполняем nazad(); else if (command == '1' || results.value == 0xFF609F) sMotor(); else if (command == '5' || results.value == 0xFF32CD) leftRul(); else if (command == '6' || results.value == 0xFF02FD) rightRul(); if (command == '4' || results.value == 0xFF609F) sRul(); else if (command == 'a') //Запустить сценарий разворота razvorotLeft(); else if (command == 's') // Вкл\Выкл свет svet(); if (command == 'z' || results.value == 0xFFB04F) //Установка мощности двигателя 1ая скорость power = 100; else if (command == 'x' || results.value == 0xFF906F) //Установка мощности двигателя 2ая скорость power = 200; else if (command == 'c' || results.value == 0xFFA05F) //Максимальная скорость power = 255; analogWrite(gazPin, power); //Установит значение мощности двигателя //а теперь повторим в бесконечно послушно слушаем команды и выполняем } } Есть вопросы ещё?