Вопросы по программированию.
- Войдите на сайт для отправки комментариев
Сб, 20/05/2017 - 13:59
Доброго времени суток. Подскажите пожалуйста. Как будет выглядеть код, имея шилд дисплея с кнопками? Хочется регулировать частоту выходного сигнала и скважность с отображением на дисплее информации, соответственно регулируя имеющимися на шилде кнопками. Если это влезет в UNO R3. Я ещё изучаю пружиной и программирование, и прошу помощи как пример связать дисплей и кнопки с шим. Заранее большое спасибо)))
// Инициализация //
1. Инициализируете таймер
2. Инициализируете GPIO
3. Инициализируете дисплей
// Основной цикл //
1. Получаете значение с кнопки
2. Изменяете переменные, хранящие значения
3. Производите необходимые расчёты
4. Обновляете счётные и настроечные регистры таймера
5. Обновляете данные на дисплее
здрасти есть вопросики по програмированию ардуино нано .
Вообщем у меня джойстик на нано и передатчик на нем HC-12 СДЕЛАН И ОТКАЛИБРОВАН по проекту
https://www.youtube.com/watch?v=89Z6-Bb8oNU
Все устраивает НО там проект на 2 мотора я ни как не могу туда запихать управление сервой
мне нужен один мотор и серва .
Если поможете с меня подробный отчет о работе моей лодочки.
Если поможете с меня подробный отчет о работе моей лодочки.
В былые времена, говорят, колонизаторы целые страны за бусы покупали :)
Вообщем у меня джойстик на нано и передатчик на нем HC-12 СДЕЛАН И ОТКАЛИБРОВАН по проекту
https://www.youtube.com/watch?v=89Z6-Bb8oNU
Все устраивает НО там проект на 2 мотора я ни как не могу туда запихать управление сервой
мне нужен один мотор и серва .
Я конечно сильно не вникал, но похоже, там почти ничего и переделывать-то не надо. Судя по картинке, передаются три байта. Вот в третьем байте у Вас будет не скорость второго мотора, а угол поворота сервы (если он не больше 255). Масштабирование проверить само собой.
//пин к которому подключен левый джойстик int LeftPin = A0; //пин к которому подключен правый джойстик int RightPin = A1; //позиция левого джойстика int LeftPosition = 0; //позиция правого джойстика int RightPosition = 0; //значение ШИМ для левого двигателя int LeftPWM =0; //значение ШИМ для правого двигателя int RightPWM =0; //массив из трех байт (направления вращения моторов,LeftPWM,RightPWM) byte SendArray[] = {0, 0, 0}; void setup() { // инициализация обмена данными по серийному протоколу со скоростью 9600 bps: Serial.begin(9600); pinMode(LeftPin, INPUT); pinMode(RightPin, INPUT); } void loop() { //читаем значения с аналоговых выходов к которым подключены резисторы LeftPosition = analogRead(LeftPin); RightPosition = analogRead(RightPin); //------------------------- //LEFT joystick (A0) | //------------------------- if (LeftPosition < 199){ // левый джойстиск до упора назад LeftPWM = 255; //0-й байт значения для вращения левого мотора //IN1 bitWrite(SendArray[0], 0, 1); //IN2 bitWrite(SendArray[0], 1, 0); //EN1 SendArray[1] = LeftPWM; }else if (LeftPosition >= 199 && LeftPosition <= 455){ // левый джойстиск немного назад LeftPWM = map(LeftPosition, 199, 455, 255, 25); //IN1 bitWrite(SendArray[0], 0, 1); //IN2 bitWrite(SendArray[0], 1, 0); //EN1 SendArray[1] = LeftPWM; } else if (LeftPosition > 455 && LeftPosition <495){ // левый джойстиск нейтральное положение LeftPWM = 0; //IN1 bitWrite(SendArray[0], 0, 0); //IN2 bitWrite(SendArray[0], 1, 0); //EN1 SendArray[1] = LeftPWM; } else if (LeftPosition >= 495 && LeftPosition <= 751){ // левый джойстиск немного вперед LeftPWM = map(LeftPosition, 495, 751, 25, 255); //IN1 bitWrite(SendArray[0], 0, 0); //IN2 bitWrite(SendArray[0], 1, 1); //EN1 SendArray[1] = LeftPWM; } else if (LeftPosition > 751){ // левый джойстиск до упора вперед LeftPWM = 255; //IN1 bitWrite(SendArray[0], 0, 0); //IN2 bitWrite(SendArray[0], 1, 1); //EN1 SendArray[1] = LeftPWM; } //------------------------- //RIGHT joystick (A1) | //------------------------- if (RightPosition < 179){ // правый джойстиск до упора назад RightPWM = 255; //IN3 bitWrite(SendArray[0], 2, 1); //IN4 bitWrite(SendArray[0], 3, 0); //EN2 SendArray[2] = RightPWM; }else if (RightPosition >= 179 && RightPosition <= 435){ // правый джойстиск немного назад RightPWM = map(RightPosition, 179, 435, 255, 25); //IN3 bitWrite(SendArray[0], 2, 1); //IN4 bitWrite(SendArray[0], 3, 0); //EN2 SendArray[2] = RightPWM; } else if (RightPosition > 435 && RightPosition <475){ // правый джойстиск нейтральное положение RightPWM = 0; //IN3 bitWrite(SendArray[0], 2, 0); //IN4 bitWrite(SendArray[0], 3, 0); //EN2 SendArray[2] = RightPWM; } else if (RightPosition >= 475 && RightPosition <= 731 ){ // правый джойстиск немного вперед RightPWM = map(RightPosition, 475, 731, 25, 255); //IN3 bitWrite(SendArray[0], 2, 0); //IN4 bitWrite(SendArray[0], 3, 1); //EN2 SendArray[2] = RightPWM; } else if (RightPosition > 731){ // правый джойстиск до упора вперед RightPWM = 255; //IN3 bitWrite(SendArray[0], 2, 0); //IN4 bitWrite(SendArray[0], 3, 1); //EN2 SendArray[2] = RightPWM; } //отправляем повороты ручек приемнику Serial.write(SendArray, 3); // печатаем результаты (для проверки и калибровки) //Serial.println (SendArray[0],BIN); //Serial.println (SendArray[1],DEC); //Serial.println (SendArray[2],DEC); delay(500); // добавляем задержку между считыванием данныха для сервы что нужно библиотеку сервы впихнуть или может какие цифры изменить .
научите знатоки а то мозг уже из ушей полез.
//пин к которому подключен левый джойстик int LeftPin = A0; //пин к которому подключен правый джойстик int RightPin = A1; //позиция левого джойстика int LeftPosition = 0; //позиция правого джойстика int RightPosition = 0; //значение ШИМ для левого двигателя int LeftPWM =0; //значение ШИМ для правого двигателя int RightPWM =0; //массив из трех байт (направления вращения моторов,LeftPWM,RightPWM) byte SendArray[] = {0, 0, 0}; void setup() { // инициализация обмена данными по серийному протоколу со скоростью 9600 bps: Serial.begin(9600); pinMode(LeftPin, INPUT); pinMode(RightPin, INPUT); } void loop() { //читаем значения с аналоговых выходов к которым подключены резисторы LeftPosition = analogRead(LeftPin); RightPosition = analogRead(RightPin); //------------------------- //LEFT joystick (A0) | //------------------------- if (LeftPosition < 199){ // левый джойстиск до упора назад LeftPWM = 255; //0-й байт значения для вращения левого мотора //IN1 bitWrite(SendArray[0], 0, 1); //IN2 bitWrite(SendArray[0], 1, 0); //EN1 SendArray[1] = LeftPWM; }else if (LeftPosition >= 199 && LeftPosition <= 455){ // левый джойстиск немного назад LeftPWM = map(LeftPosition, 199, 455, 255, 25); //IN1 bitWrite(SendArray[0], 0, 1); //IN2 bitWrite(SendArray[0], 1, 0); //EN1 SendArray[1] = LeftPWM; } else if (LeftPosition > 455 && LeftPosition <495){ // левый джойстиск нейтральное положение LeftPWM = 0; //IN1 bitWrite(SendArray[0], 0, 0); //IN2 bitWrite(SendArray[0], 1, 0); //EN1 SendArray[1] = LeftPWM; } else if (LeftPosition >= 495 && LeftPosition <= 751){ // левый джойстиск немного вперед LeftPWM = map(LeftPosition, 495, 751, 25, 255); //IN1 bitWrite(SendArray[0], 0, 0); //IN2 bitWrite(SendArray[0], 1, 1); //EN1 SendArray[1] = LeftPWM; } else if (LeftPosition > 751){ // левый джойстиск до упора вперед LeftPWM = 255; //IN1 bitWrite(SendArray[0], 0, 0); //IN2 bitWrite(SendArray[0], 1, 1); //EN1 SendArray[1] = LeftPWM; } //------------------------- //RIGHT joystick (A1) | //------------------------- if (RightPosition < 179){ // правый джойстиск до упора назад RightPWM = 255; //IN3 bitWrite(SendArray[0], 2, 1); //IN4 bitWrite(SendArray[0], 3, 0); //EN2 SendArray[2] = RightPWM; }else if (RightPosition >= 179 && RightPosition <= 435){ // правый джойстиск немного назад RightPWM = map(RightPosition, 179, 435, 255, 25); //IN3 bitWrite(SendArray[0], 2, 1); //IN4 bitWrite(SendArray[0], 3, 0); //EN2 SendArray[2] = RightPWM; } else if (RightPosition > 435 && RightPosition <475){ // правый джойстиск нейтральное положение RightPWM = 0; //IN3 bitWrite(SendArray[0], 2, 0); //IN4 bitWrite(SendArray[0], 3, 0); //EN2 SendArray[2] = RightPWM; } else if (RightPosition >= 475 && RightPosition <= 731 ){ // правый джойстиск немного вперед RightPWM = map(RightPosition, 475, 731, 25, 255); //IN3 bitWrite(SendArray[0], 2, 0); //IN4 bitWrite(SendArray[0], 3, 1); //EN2 SendArray[2] = RightPWM; } else if (RightPosition > 731){ // правый джойстиск до упора вперед RightPWM = 255; //IN3 bitWrite(SendArray[0], 2, 0); //IN4 bitWrite(SendArray[0], 3, 1); //EN2 SendArray[2] = RightPWM; } //отправляем повороты ручек приемнику Serial.write(SendArray, 3); // печатаем результаты (для проверки и калибровки) //Serial.println (SendArray[0],BIN); //Serial.println (SendArray[1],DEC); //Serial.println (SendArray[2],DEC); delay(500); // добавляем задержку между считыванием данныхну это же раздел вопросы по програмированию
- ну я их и задаю
вроде конкретно вполне по програмированию
а насчет поиздеваться создайте свой раздел и там издеваитесь на здоровье.
вопрос был задан по адресу !
А вот с моим ответом вы сможете разобраться. Потому чем глубже программирование , тем ..."толще партизаны".https://youtu.be/DwI65tBNN1I?t=417
Уж прямо, из ушей! :) Если Вы про серву вообще ничего не знаете, начните с примеров от библиотеки Servo из стандартной поставки IDE. Дальше, любимый учебный пример по работе с сервомотором - это управление сервой с помощью потенциометра (в сети их мильён). Найдите и сделайте его. А Ваш джойстик - это по сути и есть потенциометр. Дальше всё понятно должно стать.
Уж прямо, из ушей! :) Если Вы про серву вообще ничего не знаете, начните с примеров от библиотеки Servo из стандартной поставки IDE. Дальше, любимый учебный пример по работе с сервомотором - это управление сервой с помощью потенциометра (в сети их мильён). Найдите и сделайте его. А Ваш джойстик - это по сути и есть потенциометр. Дальше всё понятно должно стать.
я менял полностью скетч и тогда управлял с джостика сервой без проблем
и моторами я на другом скетче тож управляю
а когда соедидяю их(видимо неправельно) ,то появляеться задержка и подвисание меня энто не устраивает
и я в поиске по форумам читаю и ищу примеры срощенных скетчей
вот последний висячий скетч передатчика
// VWR 4 CHANNEL SERIAL RECEIVER (HC-12) #include <Servo.h> Servo servo2; // Common servo setup values int minPulse = 1000; // minimum servo position, us (microseconds) int maxPulse = 2000; // maximum servo position, us // User input for servo and position int userInput[3]; // raw input from serial buffer, 3 bytes int startbyte; // start byte, begin reading input int servo; // which servo to pulse? int pos; // servo angle 0-180 int i; // iterator //левый мотор int IN2 = 8; int IN1 = 7; int EN1 = 6; byte Byte3incoming[3] = {0,0,0}; //массив входящих 3-х байт void setup(){ // инициализация обмена данными по серийному протоколу со скоростью 9600 bps: Serial.begin(9600); // Attach each Servo object to a digital pin servo2.attach(3, minPulse, maxPulse); // Set servos to neutral servo2.write(90); } void loop(){ // Wait for 3 bytes in buffer if (Serial.available() > 2) { startbyte = Serial.read(); if (startbyte == 255) { for (i=0;i<2;i++) { userInput[i] = Serial.read(); } //читаем пришедший пакет Serial.readBytes(Byte3incoming, 3); digitalWrite (IN1,bitRead(Byte3incoming[0],0)); digitalWrite (IN2,bitRead(Byte3incoming[0],1)); analogWrite (EN1,Byte3incoming[1]); } // First byte = servo servo = userInput[0]; // Second byte = position pos = userInput[1]; // Packet error checking if (pos == 255) { servo = 255; } // Assign new position switch (servo) { case 1: //S1 break; case 2: //S2 servo2.write(pos); break; case 3: //PAN break; case 4: //TILT break; } } }Подскажите пожалуйста. Как к этому скетчу прикрутить кнопку без фиксации. Т.е. при нажатии и отпускании программа заработала, а при повторном нажатии и отпускании прекращала выполнение. При очередном нажатии начинала выполнение с самого начала. Строго не судите я начинающий ардуинщик!!! Буду благодарен за помощь.
Удачно тема названа,
прямо такой honeypot получается..
У меня очень плохо получается читать чужой код, куда хуже чем писать свой. Что в конкретном случае не так с Serial.available()? То, что он не дождавшись прихода еще 3х байт начинает читать
Serial.readBytes(Byte3incoming, 3);?
Подскажите пожалуйста. Как к этому скетчу прикрутить кнопку без фиксации. Т.е. при нажатии и отпускании программа заработала, а при повторном нажатии и отпускании прекращала выполнение. При очередном нажатии начинала выполнение с самого начала. Строго не судите я начинающий ардуинщик!!! Буду благодарен за помощь.
Создайте отдельную тему , вставте правильно код и Вам помогут.
Подскажите пожалуйста. Как к этому скетчу прикрутить кнопку без фиксации. Т.е. при нажатии и отпускании программа заработала, а при повторном нажатии и отпускании прекращала выполнение.
это невозможно в принципе. Серьезно, я не прикалываюсь. К ЭТОМУ КОДУ прикрутить кнопку нельзя, так как при наличии в коде оператора delay() кнопка не работает. А ваш код весь состояит из этих delay
Создайте отдельную тему , вставте правильно код и Вам помогут.
нет, в этом случае помочь нельзя
Подскажите пожалуйста. Как к этому скетчу прикрутить кнопку без фиксации. Т.е. при нажатии и отпускании программа заработала, а при повторном нажатии и отпускании прекращала выполнение.
это невозможно в принципе. Серьезно, я не прикалываюсь. К ЭТОМУ КОДУ прикрутить кнопку нельзя, так как при наличии в коде оператора delay() кнопка не работает. А ваш код весь состояит из этих delay
Создайте отдельную тему , вставте правильно код и Вам помогут.
нет, в этом случае помочь нельзя
Та прямтаки! Переименовываем все делеи в коде оптом например на delay_, которая обявляется как void delay_(int t){for(int i=t/100;i;i--){delay(100);GetKey();}} где в GetKey() делаем шо надо с кнопкой. Подход конечно не блеск, но такой кривой код он точно не испортит )))
ПС. jdc, больше так писать не надо. Обещайте нам, что вы точно не будете так гомнокодить.
главна, какие цыфры ни ставь, сиравно пауза 0.5 сек. Волшебный Ардуина.
delay(500); // пауза 0.5 секунд digitalWrite(r, HIGH); //включаем зеленый delay(400); // пауза 0.5 секунда digitalWrite(r, LOW); //выключаем зеленый delay(300); // пауза 0.5 секунда digitalWrite(r, HIGH); //включаем зеленый delay(200); // пауза 0.5секунда digitalWrite(r, LOW); //выключаем зеленый delay(100); // пауза 0.5 секуТа прямтаки! Переименовываем все делеи в коде оптом например на delay_, которая обявляется как void delay_(int t){for(int i=t/100;i;i--){delay(100);GetKey();}} где в GetKey() делаем шо надо с кнопкой. Подход конечно не блеск, но такой кривой код он точно не испортит )))
ага, так прокатит. Я тут даже публиковал классы для подобных "RTOS на коленке"... :)
главна, какие цыфры ни ставь, сиравно пауза 0.5 сек. Волшебный Ардуина.
delay(500); // пауза 0.5 секунд digitalWrite(r, HIGH); //включаем зеленый delay(400); // пауза 0.5 секунда digitalWrite(r, LOW); //выключаем зеленый delay(300); // пауза 0.5 секунда digitalWrite(r, HIGH); //включаем зеленый delay(200); // пауза 0.5секунда digitalWrite(r, LOW); //выключаем зеленый delay(100); // пауза 0.5 секуДа это я так понял комментарий к коду, поэтому не стал его менять, а там подправил время как мне надо было. Я же говорю, что только учусь программировать ардуину! Но спасибо за замечание, я это учту.
Всем спасибо за совет. Проблема решилась 50% переделкой кода под реле, для чего и проектировалось. Только немного иначе. И там и в др. коде кнопка запускает. А штатный резет останавливает программу. Лишь с одним но (при перезагрузке реле стартуе и получается сигнал инвертируется по выходу реле. А в скетче для реле всё хорошо. А тему новую не создал, по тому что не стал застрять форум. Смотрю вопросы по программированию задают здесь, а мой вопрос именно с проблемой в коде! Это и есть программирование. Кстате это мой первый проэкт. P.s. Учту все замечания.
Посмотрите так и постарайтесь разобраться!
// Будьте внимательны!!! Кнопка в нажатом состоянии замыкает на МИНУС #define r 12 #define g 11 #define b 10 #define c 9 #define buttonPin1 6 bool kn_start =0; bool fl_start = 1; uint32_t time; uint16_t myVar []={0,3000,500,400,300,200,100,100,100,100,100}; uint32_t pausa; byte x; byte var; bool f_start = 1; bool count=1; bool regim; void setup() //процедура setup { pinMode(r, OUTPUT); pinMode(g, OUTPUT); pinMode(b, OUTPUT); pinMode(c, OUTPUT); pinMode(buttonPin1, INPUT_PULLUP); Serial.begin(9600); } void loop(){ //Проверяем кнопку на нажатие и антидребезг if (!digitalRead(buttonPin1) != fl_start) { //Если сигнал изменился fl_start = !fl_start; time = millis(); } if(kn_start == digitalRead(buttonPin1) && millis() - time > 20){ kn_start = !digitalRead(buttonPin1); } if(!kn_start && !f_start){ f_start = 1; regim = !regim; } else if (f_start && kn_start)f_start = 0; if (regim) { if(millis() - pausa >= myVar[x]){ pausa = millis(); switch (var){ case 0: digitalWrite(r, count); x++; count = !count; if(x==10){ var++; x=0; } break; case 1: digitalWrite(g, count); x++; count = !count; if(x==10){ var++; x=0; } break; case 2: digitalWrite(b, count); x++; count = !count; if(x==10){ var++; x=0; } break; case 3: digitalWrite(c, count); x++; count = !count; if(x==10){ var = 0; x=0; } break; } } } else{ digitalWrite(r, 0); digitalWrite(g, 0); digitalWrite(b, 0); digitalWrite(c, 0); var = 0; x=0; count=1; } }Посмотрите так и постарайтесь разобраться!
Спасибо за помощь буду разбираться с кодом. Прошил все отлично работает
[/quote]
Спасибо за помощь буду разбираться с кодом.
[/quote]
Код сократил (Хотя работает он также) и прокоментировал - чтобы Вам легче было разобраться
// Будьте внимательны!!! Кнопка в нажатом состоянии замыкает на МИНУС #define r 12 #define g 11 #define b 10 #define c 9 #define buttonPin1 6 uint16_t myVar []={0,3000,500,400,300,200,100,100,100,100,100};//Масив пауз bool kn_start; //Если кнопка нажата - kn_start = 1 bool fl_start = 1; //Для антидребезга uint32_t time; //Для антидребезга uint32_t pausa; //Для фиксации времени byte x; //порядковый номер масива byte led = 12; //Здесь меняется пин для лед bool f_start = 1; //Для смены режима bool count=1; //Состояние лед вк. - вык. bool regim; void setup(){ pinMode(r, OUTPUT); pinMode(g, OUTPUT); pinMode(b, OUTPUT); pinMode(c, OUTPUT); pinMode(buttonPin1, INPUT_PULLUP);//Кнопка на вход с подтяжкойк к плюсу //Serial.begin(9600); } void loop(){ //Проверяем кнопку на нажатие и антидребезг if (!digitalRead(buttonPin1) != fl_start) { //Если сигнал изменился fl_start = !fl_start; time = millis(); } if(kn_start == digitalRead(buttonPin1) && millis() - time > 20){ kn_start = !digitalRead(buttonPin1); } //если кнопка нажата меняем режим if(!kn_start && !f_start){ f_start = 1; regim = !regim; } else if (f_start && kn_start)f_start = 0; if (regim){ //Если режим = 1 if(millis() - pausa >= myVar[x]){ //Проверяем паузу pausa = millis(); //Фиксируем время digitalWrite(led, count); //Зажигаем или тушим лед x++; //Ставим новое время задержки count = !count; //Меняем состояние if(x==10){ //Если задержки в масиве прошли все? x=0; //перехходим на первую if(led>9)led--; //Меняем порт else led=12; } } } else{ //Если режим = 0 - Устанавлюем исходное состояние digitalWrite(r, 0); digitalWrite(g, 0); digitalWrite(b, 0); digitalWrite(c, 0); led=12; x=0; count=1; } }вот спасибки все получилось !
еще одна проблема осталась !
как сделать чтоб мое устройство останавливалось при потери связи, а то я даю команду вперед и вырубаю пульт, а она зараза прет
все дальше и дальше
И сигнал когда батарейка садиться
(с меня кубанское домашнее вино будет !) ребят не обесудьте я живу в станице , но у нас лучшее вино.
ДЖОЙ
// VWR 4 CHANNEL SERIAL TRANSMITTER (HC-12) // ANALOG INPUTS const int joypin2 = A1; //Joystick Y1 int LeftPin = A0; int servo; //позиция джойстика руля int LeftPosition = 0; //значение ШИМ для двигателя руля int LeftPWM =0; //массив из трех байт (направления вращения моторов,LeftPWM,) byte SendArray[] = {0, 0, 0}; //переменная для хранения значения ответа от приемника (массив длиной 1 байт) byte answerBute[1] = {0}; void setup() { Serial.begin(9600); // ждем ответа подтверждения от приемника не более 0.3 сек Serial.setTimeout(300); pinMode(2, INPUT_PULLUP); pinMode(LeftPin, INPUT); //светодиод наличия связи между платами pinMode(13,OUTPUT); } void loop(){ //READ ANALOG INPUTS TO INT int val2 = analogRead(joypin2); //читаем значения с аналоговых выходов к которым подключены резисторы LeftPosition = analogRead(LeftPin); //------------------------- //LEFT joystick (A0) | //------------------------- if (LeftPosition < 60){ // левый джойстиск до упора назад LeftPWM = 255; //0-й байт значения для вращения левого мотора //IN1 bitWrite(SendArray[0], 0, 1); //IN2 bitWrite(SendArray[0], 1, 0); //EN1 SendArray[1] = LeftPWM; }else if (LeftPosition >= 60 && LeftPosition <= 455){ // левый джойстиск немного назад LeftPWM = map(LeftPosition, 60, 455, 255, 25); //IN1 bitWrite(SendArray[0], 0, 1); //IN2 bitWrite(SendArray[0], 1, 0); //EN1 SendArray[1] = LeftPWM; } else if (LeftPosition > 455 && LeftPosition <520){ // левый джойстиск нейтральное положение LeftPWM = 0; //IN1 bitWrite(SendArray[0], 0, 0); //IN2 bitWrite(SendArray[0], 1, 0); //EN1 SendArray[1] = LeftPWM; } else if (LeftPosition >= 520 && LeftPosition <= 980){ // левый джойстиск немного вперед LeftPWM = map(LeftPosition, 520, 980, 25, 255); //IN1 bitWrite(SendArray[0], 0, 0); //IN2 bitWrite(SendArray[0], 1, 1); //EN1 SendArray[1] = LeftPWM; } else if (LeftPosition > 980){ // левый джойстиск до упора вперед LeftPWM = 255; //IN1 bitWrite(SendArray[0], 0, 0); //IN2 bitWrite(SendArray[0], 1, 1); //EN1 SendArray[1] = LeftPWM; } //MAP ANALOG VALS TO SERVO VALS (0-90-180) val2 = map(val2, 0, 1023, 0, 180); //SEND TO MOVE FUNCTION move(2, val2); } //MOVE FUNCTION AND SEND TO TX void move(int servo, int angle) { Serial.write(char(255)); Serial.write(char(servo)); Serial.write(char(angle)); //отправляем повороты ручек приемнику Serial.write(SendArray, 3); // печатаем результаты (для проверки и калибровки) //Serial.println (SendArray[0],BIN); //Serial.println (SendArray[1],DEC); //Serial.println (SendArray[2],DEC); delay(50); //ждем от при if (Serial.readBytes(answerBute,1) > 0) { //пришел ответ от приемника и пакет не битый //проверяем только первый байт if (SendArray[0]==answerBute[0]) digitalWrite(13,1); else digitalWrite(13,0); } else { //отвалились по таймауту - проблема со связью digitalWrite(13,0); } }и приеМНИК!!
// VWR 4 CHANNEL SERIAL RECEIVER (HC-12) #include <Servo.h> Servo servo2; // Common servo setup values int minPulse = 1000; // minimum servo position, us (microseconds) int maxPulse = 2000; // maximum servo position, us // User input for servo and position int userInput[3]; // raw input from serial buffer, 3 bytes int startbyte; // start byte, begin reading input int servo; // which servo to pulse? int pos; // servo angle 0-180 int i; // iterator //левый мотор int IN2 = 8; int IN1 = 7; int EN1 = 6; byte Byte3incoming[3] = {0,0,0}; //массив входящих 3-х байт void setup(){ // инициализация обмена данными по серийному протоколу со скоростью 9600 bps: Serial.begin(9600); // ждем любую следующую команду от передатчика не более 0.3 сек Serial.setTimeout(300); //объявляем все выводы как выводы !!! pinMode(EN1,OUTPUT); pinMode(IN1,OUTPUT); pinMode(IN2,OUTPUT); //светодиод наличия связи между платами pinMode(13,OUTPUT); // Attach each Servo object to a digital pin servo2.attach(3, minPulse, maxPulse); // Set servos to neutral servo2.write(90); } void loop(){ // Wait for 3 bytes in buffer if (Serial.available() > 2) { startbyte = Serial.read(); if (startbyte == 255) { for (i=0;i<2;i++) { userInput[i] = Serial.read(); } //читаем пришедший пакет Serial.readBytes(Byte3incoming, 3); digitalWrite (IN1,bitRead(Byte3incoming[0],0)); digitalWrite (IN2,bitRead(Byte3incoming[0],1)); analogWrite (EN1,Byte3incoming[1]); } // First byte = servo servo = userInput[0]; // Second byte = position pos = userInput[1]; // Packet error checking if (pos == 255) { servo = 255; } // Assign new position switch (servo) { case 1: //S1 break; case 2: //S2 servo2.write(pos); break; case 3: //PAN break; case 4: //TILT break; } } }АРДУИНО НАНО КИТАЙСКИЙ ! ДЖОСТИК ОТ P/S ПЕРЕДЕЛАН , ПОСЛЕДНИЙ СКЕТЧ РАБОТАЛ, НО СЛИЖКОМ РЕЗКОЕ НАРАСТАНИЕ ОБОРОТОВ , МОГУ ДАТЬ КАЛИБРОВКИ ПО ДЖОСТИКУ .
СЛОВА НА ВЕТЕР НЕ БРОСАЮ.
Всем доброго времени суток! Гуру, дайте совет, стоит ли заморачиваться на следующую тему:
Имеется китайская NANO V3 ATMega328P и 8-ми канальный модуль WS2812 оттуда же.
Я хотел поставить на радиоуправляемую модель, в багги HIMOTO, FPV камеру с передатчиком. Но прикинул, что лучше ставить 2 камеры, для организации заднего вида. К счастью нашел на Али 2-х канальный переключатель для камер работающий через 3-й (свободный канал), но незадача в том, что в пульте крайне неудобно расположен переключатель 3-го канала. Вопрос в следующем: возможна ли реализация на NANO считывания импульсных сигналов и их эмуляция ардуиной? Т.е. При торможении включается красный, а при заднем ходе эмулируется импульсный сигназ 3-го канала для переключения камеры и включается белый. Как то так. Спасибо.
Возможна.
У меня эта хрень реализована тиньке25 и ещё лебёдку таскает с пульта. На нане тем более всё можно сделать.
Спасибо!