Вопросы по программированию.

Stesnjashka
Offline
Зарегистрирован: 19.05.2017

Доброго времени суток. Подскажите пожалуйста. Как будет выглядеть код, имея шилд дисплея с кнопками? Хочется регулировать частоту выходного сигнала и скважность с отображением на дисплее информации, соответственно регулируя имеющимися на шилде кнопками. Если это влезет в UNO R3. Я ещё изучаю пружиной и программирование, и прошу помощи как пример связать дисплей и кнопки с шим. Заранее большое спасибо)))

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

// Инициализация //

1. Инициализируете таймер

2. Инициализируете GPIO

3. Инициализируете дисплей

// Основной цикл //

1. Получаете значение с кнопки

2. Изменяете переменные, хранящие значения

3. Производите необходимые расчёты

4. Обновляете счётные и настроечные регистры таймера

5. Обновляете данные на дисплее

san384
Offline
Зарегистрирован: 29.10.2017

здрасти есть вопросики по програмированию ардуино нано .

Вообщем у меня джойстик на нано и передатчик на нем HC-12 СДЕЛАН И ОТКАЛИБРОВАН по проекту

https://www.youtube.com/watch?v=89Z6-Bb8oNU

Все устраивает НО там проект на 2 мотора я ни как не могу туда запихать управление сервой

мне нужен один мотор и серва .

Если поможете с меня подробный отчет о работе моей лодочки.

 

b707
Offline
Зарегистрирован: 26.05.2017

san384 пишет:

Если поможете с меня подробный отчет о работе моей лодочки.

В былые времена, говорят, колонизаторы целые страны за бусы покупали :)

kalapanga
Offline
Зарегистрирован: 23.10.2016

san384 пишет:

Вообщем у меня джойстик на нано и передатчик на нем HC-12 СДЕЛАН И ОТКАЛИБРОВАН по проекту

https://www.youtube.com/watch?v=89Z6-Bb8oNU

Все устраивает НО там проект на 2 мотора я ни как не могу туда запихать управление сервой

мне нужен один мотор и серва .

Я конечно сильно не вникал, но похоже, там почти ничего и переделывать-то не надо. Судя по картинке, передаются три байта. Вот в третьем байте у Вас будет не скорость второго мотора, а угол поворота сервы (если он не больше 255). Масштабирование проверить само собой.

san384
Offline
Зарегистрирован: 29.10.2017

//пин к которому подключен левый джойстик
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); // добавляем задержку между считыванием данных

 

san384
Offline
Зарегистрирован: 29.10.2017

san384 пишет:
там от 0-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); // добавляем задержку между считыванием данных

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

san384 пишет:
научите знатоки а то мозг уже из ушей полез.
Разумется если как плотва на поверхности программирования плаваете, то ничего хорошего не выйдет.

san384
Offline
Зарегистрирован: 29.10.2017

qwone пишет:

san384 пишет:
научите знатоки а то мозг уже из ушей полез.
Разумется если как плотва на поверхности программирования плаваете, то ничего хорошего не выйдет.

ну это же раздел вопросы по програмированию

- ну я их и задаю

вроде конкретно вполне по програмированию

а насчет поиздеваться создайте свой раздел и там издеваитесь на здоровье.

вопрос был задан по адресу !

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

А вот с моим ответом вы сможете разобраться. Потому чем глубже программирование , тем ..."толще партизаны".https://youtu.be/DwI65tBNN1I?t=417

kalapanga
Offline
Зарегистрирован: 23.10.2016

Уж прямо, из ушей! :) Если Вы про серву вообще ничего не знаете, начните с примеров от библиотеки Servo из стандартной поставки IDE. Дальше, любимый учебный пример по работе с сервомотором - это управление сервой с помощью потенциометра (в сети их мильён). Найдите и сделайте его. А Ваш джойстик - это по сути и есть потенциометр. Дальше всё понятно должно стать.

san384
Offline
Зарегистрирован: 29.10.2017

kalapanga пишет:

Уж прямо, из ушей! :) Если Вы про серву вообще ничего не знаете, начните с примеров от библиотеки Servo из стандартной поставки IDE. Дальше, любимый учебный пример по работе с сервомотором - это управление сервой с помощью потенциометра (в сети их мильён). Найдите и сделайте его. А Ваш джойстик - это по сути и есть потенциометр. Дальше всё понятно должно стать.

я менял полностью скетч и тогда управлял с джостика сервой без проблем

и моторами я на другом скетче тож управляю

а когда соедидяю их(видимо неправельно) ,то появляеться задержка и подвисание меня энто не устраивает

и я в поиске по форумам читаю и ищу примеры срощенных скетчей

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
169 delay(500); //<-- избавляйтесь от этой команды

 

san384
Offline
Зарегистрирован: 29.10.2017

вот последний висячий скетч передатчика

// 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;

}
}
}

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
Serial.available()  : <-- вы не понимаете как это работает.

 

jdc
Offline
Зарегистрирован: 31.10.2017

Подскажите пожалуйста. Как к этому скетчу прикрутить кнопку без фиксации. Т.е. при нажатии и отпускании программа заработала, а при повторном нажатии и отпускании прекращала выполнение. При очередном нажатии начинала выполнение с самого начала. Строго не судите я начинающий ардуинщик!!! Буду благодарен за помощь.

int r = 12;
int g = 11;
int b = 10;
int c = 9;
 
void setup() //процедура setup
 
{
 
pinMode(r, OUTPUT);
pinMode(g, OUTPUT);
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
}
 
void loop() //процедура loop
 
 
 
{
 
    digitalWrite(r, HIGH); //включаем зеленый
    delay(3000); // пауза 5 секунд
    digitalWrite(r, LOW); //выключаем зеленый
    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 секу
    digitalWrite(r, HIGH); //включаем зеленый
    delay(100); // пауза 0.5секунда
    digitalWrite(r, LOW); //выключаем зеленый
    delay(100); // пауза 0.5 секу
    digitalWrite(r, HIGH); //включаем зеленый
    delay(100); // пауза 0.5секунда
    digitalWrite(r, LOW); //выключаем зеленый
    delay(100); // пауза 0.5 секу
 
     digitalWrite(g, HIGH); //включаем зеленый
    delay(3000); // пауза 5 секунд
    digitalWrite(g, LOW); //выключаем зеленый
    delay(500); // пауза 0.5 секунд
    digitalWrite(g, HIGH); //включаем зеленый
    delay(400); // пауза 0.5 секунда
    digitalWrite(g, LOW); //выключаем зеленый
    delay(300); // пауза 0.5 секунда
    digitalWrite(g, HIGH); //включаем зеленый
    delay(200); // пауза 0.5секунда
    digitalWrite(g, LOW); //выключаем зеленый
    delay(100); // пауза 0.5 секу
    digitalWrite(g, HIGH); //включаем зеленый
    delay(100); // пауза 0.5секунда
    digitalWrite(g, LOW); //выключаем зеленый
    delay(100); // пауза 0.5 секу
    digitalWrite(g, HIGH); //включаем зеленый
    delay(100); // пауза 0.5секунда
    digitalWrite(g, LOW); //выключаем зеленый
    delay(100); // пауза 0.5 секу
 
     digitalWrite(b, HIGH); //включаем зеленый
    delay(3000); // пауза 5 секунд
    digitalWrite(b, LOW); //выключаем зеленый
    delay(500); // пауза 0.5 секунд
    digitalWrite(b, HIGH); //включаем зеленый
    delay(400); // пауза 0.5 секунда
    digitalWrite(b, LOW); //выключаем зеленый
    delay(300); // пауза 0.5 секунда
    digitalWrite(b, HIGH); //включаем зеленый
    delay(200); // пауза 0.5секунда
    digitalWrite(b, LOW); //выключаем зеленый
    delay(100); // пауза 0.5 секу
    digitalWrite(b, HIGH); //включаем зеленый
    delay(100); // пауза 0.5секунда
    digitalWrite(b, LOW); //выключаем зеленый
    delay(100); // пауза 0.5 секу
    digitalWrite(b, HIGH); //включаем зеленый
    delay(100); // пауза 0.5секунда
    digitalWrite(b, LOW); //выключаем зеленый
    delay(100); // пауза 0.5 секу
 
     digitalWrite(c, HIGH); //включаем зеленый
    delay(3000); // пауза 5 секунд
    digitalWrite(c, LOW); //выключаем зеленый
    delay(500); // пауза 0.5 секунд
    digitalWrite(c, HIGH); //включаем зеленый
    delay(400); // пауза 0.5 секунда
    digitalWrite(c, LOW); //выключаем зеленый
    delay(300); // пауза 0.5 секунда
    digitalWrite(c, HIGH); //включаем зеленый
    delay(200); // пауза 0.5секунда
    digitalWrite(c, LOW); //выключаем зеленый
    delay(100); // пауза 0.5 секу
    digitalWrite(c, HIGH); //включаем зеленый
    delay(100); // пауза 0.5секунда
    digitalWrite(c, LOW); //выключаем зеленый
    delay(100); // пауза 0.5 секу
    digitalWrite(c, HIGH); //включаем зеленый
    delay(100); // пауза 0.5секунда
    digitalWrite(c, LOW); //выключаем зеленый
    delay(100); // пауза 0.5 секу
}
Araris
Offline
Зарегистрирован: 09.11.2012

Удачно тема названа,

        прямо такой honeypot получается..

5N62V
Offline
Зарегистрирован: 25.02.2016

qwone пишет:

Serial.available()  : <-- вы не понимаете как это работает.

У меня очень плохо получается читать чужой код, куда хуже чем писать свой.  Что в конкретном случае не так с Serial.available()?   То, что он не дождавшись прихода еще 3х байт начинает читать

Serial.readBytes(Byte3incoming, 3);

?

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

jdc пишет:

Подскажите пожалуйста. Как к этому скетчу прикрутить кнопку без фиксации. Т.е. при нажатии и отпускании программа заработала, а при повторном нажатии и отпускании прекращала выполнение. При очередном нажатии начинала выполнение с самого начала. Строго не судите я начинающий ардуинщик!!! Буду благодарен за помощь.

Создайте отдельную тему , вставте правильно код и Вам помогут.

b707
Offline
Зарегистрирован: 26.05.2017

jdc пишет:

Подскажите пожалуйста. Как к этому скетчу прикрутить кнопку без фиксации. Т.е. при нажатии и отпускании программа заработала, а при повторном нажатии и отпускании прекращала выполнение.

это невозможно в принципе. Серьезно, я не прикалываюсь. К ЭТОМУ КОДУ прикрутить кнопку нельзя, так как при наличии в коде оператора delay() кнопка не работает. А ваш код весь состояит из этих delay

vosara пишет:

Создайте отдельную тему , вставте правильно код и Вам помогут.

нет, в этом случае помочь нельзя

Logik
Offline
Зарегистрирован: 05.08.2014

b707 пишет:

jdc пишет:

Подскажите пожалуйста. Как к этому скетчу прикрутить кнопку без фиксации. Т.е. при нажатии и отпускании программа заработала, а при повторном нажатии и отпускании прекращала выполнение.

это невозможно в принципе. Серьезно, я не прикалываюсь. К ЭТОМУ КОДУ прикрутить кнопку нельзя, так как при наличии в коде оператора delay() кнопка не работает. А ваш код весь состояит из этих delay

vosara пишет:

Создайте отдельную тему , вставте правильно код и Вам помогут.

нет, в этом случае помочь нельзя

Та прямтаки! Переименовываем все делеи в коде оптом например на delay_, которая обявляется как void delay_(int t){for(int i=t/100;i;i--){delay(100);GetKey();}} где в  GetKey() делаем шо надо с кнопкой. Подход конечно не блеск, но такой кривой код он точно не испортит )))

ПС. jdc, больше так писать не надо. Обещайте нам, что вы точно не будете так гомнокодить.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

главна, какие цыфры ни ставь, сиравно пауза 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 секу

 

b707
Offline
Зарегистрирован: 26.05.2017

Logik пишет:

Та прямтаки! Переименовываем все делеи в коде оптом например на delay_, которая обявляется как void delay_(int t){for(int i=t/100;i;i--){delay(100);GetKey();}} где в  GetKey() делаем шо надо с кнопкой. Подход конечно не блеск, но такой кривой код он точно не испортит )))

ага, так прокатит. Я тут даже публиковал классы для подобных "RTOS на коленке"... :)

jdc
Offline
Зарегистрирован: 31.10.2017

DetSimen пишет:

главна, какие цыфры ни ставь, сиравно пауза 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 секу

 


Да это я так понял комментарий к коду, поэтому не стал его менять, а там подправил время как мне надо было. Я же говорю, что только учусь программировать ардуину! Но спасибо за замечание, я это учту.

jdc
Offline
Зарегистрирован: 31.10.2017

Всем спасибо за совет. Проблема решилась 50% переделкой кода под реле, для чего и проектировалось. Только немного иначе. И там и в др. коде кнопка запускает. А штатный резет останавливает программу. Лишь с одним но (при перезагрузке реле стартуе и получается сигнал инвертируется по выходу реле. А в скетче для реле всё хорошо. А тему новую не создал, по тому что не стал застрять форум. Смотрю вопросы по программированию задают здесь, а мой вопрос именно с проблемой в коде! Это и есть программирование. Кстате это мой первый проэкт. P.s. Учту все замечания.

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

jdc пишет:
Всем спасибо за совет.

Посмотрите так и постарайтесь разобраться!

// Будьте внимательны!!! Кнопка в нажатом состоянии замыкает на МИНУС 
#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;
  }
}

 

jdc
Offline
Зарегистрирован: 31.10.2017

vosara пишет:

Посмотрите так и постарайтесь разобраться!

Спасибо за помощь буду разбираться с кодом. Прошил все отлично работает

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

 

[/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;
  }
}

 

san384
Offline
Зарегистрирован: 29.10.2017

qwone пишет:

169 delay(500); //<-- избавляйтесь от этой команды

 

вот спасибки все получилось !

san384
Offline
Зарегистрирован: 29.10.2017

еще одна проблема осталась !

как сделать чтоб мое устройство останавливалось при потери связи, а то я даю команду вперед и вырубаю пульт, а она зараза прет

все дальше и дальше

И сигнал когда батарейка садиться

(с меня кубанское домашнее вино будет  !) ребят не обесудьте я живу в станице , но у нас лучшее вино.

ДЖОЙ

// 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 ПЕРЕДЕЛАН , ПОСЛЕДНИЙ СКЕТЧ РАБОТАЛ, НО  СЛИЖКОМ РЕЗКОЕ НАРАСТАНИЕ ОБОРОТОВ , МОГУ ДАТЬ КАЛИБРОВКИ ПО ДЖОСТИКУ .

СЛОВА НА ВЕТЕР НЕ БРОСАЮ.

2lafrost
Offline
Зарегистрирован: 21.11.2017

Всем доброго времени суток! Гуру, дайте совет, стоит ли заморачиваться на следующую тему:

Имеется китайская NANO V3 ATMega328P и 8-ми канальный модуль WS2812 оттуда же.

Я хотел поставить на радиоуправляемую модель, в багги HIMOTO, FPV камеру с передатчиком. Но прикинул, что лучше ставить 2 камеры, для организации заднего вида. К счастью нашел на Али 2-х канальный переключатель для камер работающий через 3-й (свободный канал), но незадача в том, что в пульте крайне неудобно расположен переключатель 3-го канала. Вопрос в следующем: возможна ли реализация на NANO считывания импульсных сигналов и их эмуляция ардуиной? Т.е. При торможении включается красный, а при заднем ходе эмулируется импульсный сигназ 3-го канала для переключения камеры и включается белый. Как то так. Спасибо.

 

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Возможна.

nik182
Offline
Зарегистрирован: 04.05.2015

У меня эта хрень реализована тиньке25 и ещё лебёдку таскает с пульта. На нане тем более всё можно сделать.

2lafrost
Offline
Зарегистрирован: 21.11.2017

Спасибо!