Прикормочный кораблик, автоматизация на ардуино

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:
естественно кнопка reset приводит устройство в чувство ))), а вот замыкание контакта rst на gnd - НЕТ!
А кнока reset - это не замыкание контакта?

bwn
Offline
Зарегистрирован: 25.08.2014

ua6em пишет:

Если подавать питание на USB вход, то аппаратный сброс проходит не зависимо от положения датчика, естественно кнопка reset приводит устройство в чувство ))), а вот замыкание контакта rst на gnd - НЕТ!

Что-то Вы хитрое намудрили. Согласен с Евгением, не вижу разницы между кнопой ресет и замыканием контакта rst на граунд.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

ua6em пишет:
естественно кнопка reset приводит устройство в чувство ))), а вот замыкание контакта rst на gnd - НЕТ!
А кнока reset - это не замыкание контакта?

Решил проблему в лоб!!!
Запитал датчики от выводов ардуины настроив их на выход и выставив в HIGH )))

Да, вторая ардуина вела себя так же, на ардуине два вывода RESET, замыкал на GND тот вывод, что между GND  и +5V, что там намудрил ROBODYN с разводкой пинов не выяснял.
Но раз эффект проявился и со второй, значит это ОСОБЕННОСТИ построения платы.

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

ua6em пишет:
естественно кнопка reset приводит устройство в чувство ))), а вот замыкание контакта rst на gnd - НЕТ!
А кнока reset - это не замыкание контакта?

Евгений Петрович, так всё же, сможете изыскать возможность переделать библиотеку на совместимость с Servo.h ??? Очень хочется сервотестер в металле воплотить )))

PS а вот если бы я мог использовать STM32F103 видимо всё было бы значительно проще, там три необходимых нам таймера в полном распоряжении... среду по IDE поставил, но пока только удалось диодиком помигать )))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:

Евгений Петрович, так всё же, сможете изыскать возможность переделать библиотеку на совместимость с Servo.h ??? Очень хочется сервотестер в металле воплотить )))

Смогу, но боюсь, что не раньше выходного. Уж потерпите. Если получится раньше - отпишусь.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

ua6em пишет:

Евгений Петрович, так всё же, сможете изыскать возможность переделать библиотеку на совместимость с Servo.h ??? Очень хочется сервотестер в металле воплотить )))

Смогу, но боюсь, что не раньше выходного. Уж потерпите. Если получится раньше - отпишусь.

Да без проблем...хоть и зудит... )))
PS Удивляюсь, что никто таким проектом до сих пор не озадачился... а ведь для некоторых вопросов - незаменим.
Правда КРУТЫЕ ПАРНИ покупают готовый правильный сервотестер и не заморачиваются, но мы ж лёгких путей не ищем

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Евгений Петрович один вопрос поясните по примеру скетча:
 

#include	"TimeMeasure.h"

void setup() {
	Serial.begin(57600);
	initTimeMeasuring();
}

//
//	Если готов результат измерения, печатаем
//
void loop() {
	const uint16_t res = measureResult();
	if (res) Serial.println(res);
}

Строка 12 присваиваем переменной типа константа значение формируемое в счетчике, если данные были, то выставляется флаг ИСТИНА, если данных нет, ЛОЖЬ?
Я к тому, что следующей строкой идёт проверка и получается обрасть видимости res один цикл loop?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А зачем её ещё быть видимой где-то?

А флагов никаких нет. Просто если if'у подсунуть число, то он считает ложью 0, а истиной всё, кроме 0.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

А зачем её ещё быть видимой где-то?

А флагов никаких нет. Просто если if'у подсунуть число, то он считает ложью 0, а истиной всё, кроме 0.


Ясно, то есть, если импульс еще не измерян, строка выше присваивает переменной res =0 ?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, да.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

Ну, да.

век живи век учись )))
Удалось ли выкроить время для моей просьбы?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Пока нет, но я честно - не забыл. Как только, так сразу.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

Пока нет, но я честно - не забыл. Как только, так сразу.


А Вы на STM не поглядывали, там несколько 16 битных таймеров. Можно ли Вашу библиотеку под него адаптировать?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Нет, не поглядывал. Вообще, в руках никогда не держал и особого желания не испытываю. Для моих задач хватает avr за глаза.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

Нет, не поглядывал. Вообще, в руках никогда не держал и особого желания не испытываю. Для моих задач хватает avr за глаза.


Да вот читаю доку на STM32 на русском, могуч, реально могуч, эх, где мои 17 лет )))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, читайте.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

Ну, читайте.

Вспомнилось, 90-е, инженер-наладчик запускает фрезерный ЧПУ с точностью на фрезеровании 2 микрона, говорим о процессорах, я ему об отладке в тактах процессора, а он МНЕ: посмотри какие у Вас женщины...какие у них глаза... )))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Обновил код всё в том же посте #26. теперь может работать и со втормым таймером. Таймер выбирается константой (орисано в начале .cpp фала). Сейчас стоит второй таймер - с сервой драться не должно, там первый используется.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Поставил, проверил, серва на 9 пине не заработала, все остальные кроме 3 с ШИМ заняты, на 3 - РАБОТАЕТ!
Благодарствую Уважаемый!!!
Пока не разобрался, как Вы это сделали, но я постараюсь понять )))

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Почему не заработала? Первый таймер я не занимал. Може случайно чего забыл, я проверю, кончено.

Пока попробуйте просто ШИМ на 9 пине. Есть - нету?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

Почему не заработала? Первый таймер я не занимал. Може случайно чего забыл, я проверю, кончено.

Пока попробуйте просто ШИМ на 9 пине. Есть - нету?


Сегодня проверю, может я его чем занимал, переписываю с чистого листа
Переписал пробный скетч с нуля, задействовал все 6 ШИМ каналов доступных на ардуино нано.

Всё работает великолепно, так что до окончательного проекта Серво-Тестера на ардуино нано осталось пару шагов.

Код проверки был такой:
 

/*
 * Программа сервотестера для ARDUINO NANO
 * начало
 * 28.10.2018 - сделано ядро измерения импульса по 8 пину
 * 02.11.2018 - переход на библиотеку TimeMeasure.h
 * АКА  ЕвгенийП www.arduino.ru
 * 03.11.2018 - подключение библиотеки Servo.h проверка
 * возможности работы с шестью каналами PWM
 * ВАУ *** работает по всем 6 пинам PWM ***
 * 
 */

 // Измерение проводим через пин 2
 #define IN_PWM 2
 
// Шим доступен на пинах 3,5,6,9,10,11
 #define CH1 3
 #define CH2 5
 #define CH3 6
 #define CH4 9
 #define CH5 10
 #define CH6 11
   
// Светодиодное отобрахение режимов 
 #define LD_1000 7
 #define LD_1500 8
 #define LD_2000 12
 #define LD_RCV 13
// #define LD_PTN 1
 
// Для управления задествуем аналоговые пины
 #define PT1 A0
 #define SW1 A1
 #define SW2 A2
 #define SW3 A3

// Новая функция обработчика прерывания, подключаем
#include  "TimeMeasure.h"
#include <Servo.h>

//Серво каналы
 Servo servo_ch1;
 Servo servo_ch2;
 Servo servo_ch3;
 Servo servo_ch4;
 Servo servo_ch5;
 Servo servo_ch6;
 
 int pwm_ch1 = 0;
  int pwm_ch2 = 1000;
   int pwm_ch3 = 2000;
    int pwm_ch4 = 0;
     int pwm_ch5 = 0;
      int pwm_ch6 = 0;
 
 
void setup() {
pinMode (IN_PWM,INPUT); 
pinMode (PT1,INPUT);
pinMode (SW1,INPUT);
pinMode (SW2,INPUT);
pinMode (SW3,INPUT);

pinMode (CH1,OUTPUT);
pinMode (CH2,OUTPUT);
pinMode (CH3,OUTPUT);
pinMode (CH4,OUTPUT);
pinMode (CH5,OUTPUT);
pinMode (CH6,OUTPUT);

pinMode (LD_1000 ,OUTPUT);
pinMode (LD_1500 ,OUTPUT);
pinMode (LD_2000 ,OUTPUT);
pinMode (LD_RCV ,OUTPUT);
//pinMode (LD_PTN ,OUTPUT);

servo_ch1.attach(CH1);
servo_ch2.attach(CH2);
servo_ch3.attach(CH3);
servo_ch4.attach(CH4);
servo_ch5.attach(CH5);
servo_ch6.attach(CH6);

// Временно, для отладки разрешим вывод в порт
Serial.begin(57600);

// Установим состояние органов управления
initTimeMeasuring();
managers();

} // Конец процедуры инициализации

void managers(){
    
  } // Конец процедуры управления
  

// ***---***  
void loop() {
  const uint16_t res = measureResult();
  if (res){ 
    pwm_ch1 = res/TICKS_PER_MICROSECOND;
     pwm_ch2 = pwm_ch1;
      pwm_ch3 = 1250;
       pwm_ch4 = 1500;
        pwm_ch5 = 1750;
         pwm_ch6 = 2000;
    
    Serial.println(pwm_ch1);
    servo_ch1.writeMicroseconds(pwm_ch1);
     servo_ch2.writeMicroseconds(pwm_ch2);
      servo_ch3.writeMicroseconds(pwm_ch3);
       servo_ch4.writeMicroseconds(pwm_ch4);
        servo_ch5.writeMicroseconds(pwm_ch5);
         servo_ch6.writeMicroseconds(pwm_ch6);
    delay(15);
   }
  } // END LOOP

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Что-то не так. 

ШИМ на пинах 3 и 11 должен либо не работать, либо работать с нестандартной частотой. Ну, или мои измерения должны врать.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

Что-то не так. 

ШИМ на пинах 3 и 11 должен либо не работать, либо работать с нестандартной частотой. Ну, или мои измерения должны врать.


попереключал с 3 на 5 пин, разница есть, серва докручивает буду пытать, я тут обрадовался было )))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, Вы понимаете, что хоть какой-то таймер мне нужен :)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

Ну, Вы понимаете, что хоть какой-то таймер мне нужен :)


Конечно )))
какие пины можно использовать для servo.h ?
 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Откуда я знаю, что серве нужно от пинов, я никогда ею не пользуюсь. Яиспользую второй таймер. на этом таймере сидит ШИМ 11 и 3 пинов. В принципе ШИМ там никуда не денется. но частота будет другой. Нужно это серве или нет, я не знаю.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Ну Вы же его не всё время испотльзуете, а только 4 миллисекунды, если серва успевает шимить в оставшиеся 16 миллисекунд то может быть не всё так плохо...а в принципе для прибора 6 каналов уже перебор...ту сложно определиться с ТТХ на прибор...видимо надо остановиться на том, что без прибора делается методом научного тыка...ну мы же взрослые люди....зачем тыкаться носом, когда можно все очень точно измерить и выставить те же расходы в соответствии с измерениями...как правило в аппаратуре управления расходы калибруются в процентах, а это в абсолютных величинах от 10 до 20 микросекнд, библиотека позволяет измерять с точностью на порядок больше, то что от прибора и требуется )))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Я его настраиваю на делитель 0, а среда ардуино для ШИМа настраивает на делитель 64. Потому я и говорю про частоту.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

Я его настраиваю на делитель 0, а среда ардуино для ШИМа настраивает на делитель 64. Потому я и говорю про частоту.


Прорверил работу по всем пинам задавая длительность от 1000 до 2000 микросекунд, то-есть выставляю tau и меряю подавая на 2-й пин по всем ШИМ выходам, только с 11 пина во всем диапазоне занижает на 7 микросекунд, по всем остальным пинам полное совпадение (разность не более 1 микросекунды)
Не знаю, как, что и почему но выходит что работает!?
Скетч

/*
 * Программа сервотестера для ARDUINO NANO
 * начало
 * 28.10.2018 - сделано ядро измерения импульса по 8 пину
 * 02.11.2018 - переход на библиотеку TimeMeasure.h
 * АКА  ЕвгенийП www.arduino.ru (в папке скетча)
 * 03.11.2018 - подключение библиотеки Servo.h проверка
 * возможности работы с шестью каналами PWM
 * ВАУ *** работает по всем 6 пинам PWM ***
 * 
 */

 // Измерение проводим через пин 2
 #define IN_PWM 2
 
// Шим доступен на пинах 3,5,6,9,10,11
 #define CH1 3
 #define CH2 5
 #define CH3 6
 #define CH4 9
 #define CH5 10
 #define CH6 11
   
// Светодиодное отобрахение режимов 
 #define LD_1000 7
 #define LD_1500 8
 #define LD_2000 12
 #define LD_RCV 13
// #define LD_PTN 1
 
// Для управления задествуем аналоговые пины
 #define PT1 A0
 #define SW1 A1
 #define SW2 A2
 #define SW3 A3

// Новая функция обработчика прерывания, подключаем
#include  "TimeMeasure.h"
#include <Servo.h>

//Серво каналы
 Servo servo_ch1;
 Servo servo_ch2;
 Servo servo_ch3;
 Servo servo_ch4;
 Servo servo_ch5;
 Servo servo_ch6;
 
 int pwm_ch0 = 0;
 int pwm_ch1 = 0;
  int pwm_ch2 = 1000;
   int pwm_ch3 = 2000;
    int pwm_ch4 = 1500;
     int pwm_ch5 = 1500;
      int pwm_ch6 = 1500;
 
 
void setup() {
pinMode (IN_PWM,INPUT); 
pinMode (PT1,INPUT);
pinMode (SW1,INPUT);
pinMode (SW2,INPUT);
pinMode (SW3,INPUT);

pinMode (CH1,OUTPUT);
pinMode (CH2,OUTPUT);
pinMode (CH3,OUTPUT);
pinMode (CH4,OUTPUT);
pinMode (CH5,OUTPUT);
pinMode (CH6,OUTPUT);

pinMode (LD_1000 ,OUTPUT);
pinMode (LD_1500 ,OUTPUT);
pinMode (LD_2000 ,OUTPUT);
pinMode (LD_RCV ,OUTPUT);
//pinMode (LD_PTN ,OUTPUT);

servo_ch1.attach(CH1);
servo_ch2.attach(CH2);
servo_ch3.attach(CH3);
servo_ch4.attach(CH4);
servo_ch5.attach(CH5);
servo_ch6.attach(CH6);

// Временно, для отладки разрешим вывод в порт
Serial.begin(57600);

// Установим состояние органов управления
initTimeMeasuring();
managers();

} // Конец процедуры инициализации

void managers(){
    
  } // Конец процедуры управления
  

// ***---***  
void loop() {
  const uint16_t res = measureResult();
  if (res){ 
  pwm_ch0 = res/TICKS_PER_MICROSECOND;
//   servo_ch1.writeMicroseconds(pwm_ch1);
    Serial.println(pwm_ch0);
      } // измерили входящий импульс и продублировали на выход канала CH1
      
     pwm_ch1 = map(analogRead(PT1),0, 1023, 1000,2000);  
      pwm_ch2 = pwm_ch1;
       pwm_ch3 = pwm_ch1;
        pwm_ch4 = pwm_ch1;
         pwm_ch5 = pwm_ch1;
          pwm_ch6 = pwm_ch1;
          
 //    pwm_ch2 = map(analogRead(PT1),0, 1023, 1000,2000);     
 //     pwm_ch3 = 1500;
   //    pwm_ch4 = 1500;
     //   pwm_ch5 = 1500;
       //  pwm_ch6 = 1500;
        
     servo_ch1.writeMicroseconds(pwm_ch1);
      servo_ch2.writeMicroseconds(pwm_ch2);
       servo_ch3.writeMicroseconds(pwm_ch3);
        servo_ch4.writeMicroseconds(pwm_ch4);
         servo_ch5.writeMicroseconds(pwm_ch5);
          servo_ch6.writeMicroseconds(pwm_ch6);
         
    delay(1000);
  } // END LOOP

 

Минимальное отклонение от заданного параметра имеет шим на 10 пине, поотключал все остальные каналы, ничего в точности не изменилось, разночтение с устанавливаемым порядка 3-4 микросекунд, видимо дело в библиотеке servo.h. Можно конечно оставить и один канал, переключая его параметры на выход.
0,3% отличная точность

Пошёл еще дальше, залил в другую ардуино пробный скетч генерирующий шим на трёх пинах 9,10,11 соответственно 1000, 1500, 2000 миллисекунд, выходы подключаю на измерение скетчем, что выше, измерячет очень точно, иногда проскакивают значения на 1 больше или меньше, то-есть - измерительная часть работает безукоризненно, огрехи в генерации но допустимые

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, и слава Богу.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

Ну, и слава Богу.

Время теперь есть, примусь за макетирование, тем паче, что самолёты и коптеры у меня долго не держатся, позавчера только получил, сегодня уже ушатал )))
Но летал восхитительно жеж!!!