Автор Тема: Arduino за стрелки  (Прочетена 63855 пъти)

pach

  • Trade Count: (42)
  • Hero Member
  • *****
  • Публикации: 12341
  • Рейтинг: 1327
  • ТТ & Н0; DR & BDZ;ep.I-III(~VI)&selfmade
    • За моделизма
Re: Arduino за стрелки
« Отговор #45 -: 03 Ноември 2017, 09:02:02 »
Митко, коригирал съм се  почти веднага в следващи пост и  точно
това съм написал в него, намира се под този който коментираш ти.
Не знам защо не си го прочел!?

mitko0888

  • Trade Count: (35)
  • Hero Member
  • *****
  • Публикации: 2416
  • Рейтинг: 1028
  • H0, еп. I, II, III, IV, София
    • Снимките ми ...
Re: Arduino за стрелки
« Отговор #46 -: 03 Ноември 2017, 09:55:49 »
Ами може пък и да съм го прочел. И да съм го разбрал двусмислено. Кое е серво, кое е ардуино, кой кого управлява, кое е цифрово, кое пък толкова "фино да е настроено отвън". Видях че пишеш и за някакви честоти и т.н. И понеже някои неща не са така, ако искаш - смятай го че съм повторил - но не всичко, а това което смятам че е вярното.

pavel75

  • КЖМ - България
  • Trade Count: (18)
  • Hero Member
  • *****
  • Публикации: 1814
  • Рейтинг: 264
  • HO; IV и V; BDZ, BG; София
Re: Arduino за стрелки
« Отговор #47 -: 03 Ноември 2017, 10:04:21 »
Не е нужно да стигаме до разправии. Предлагам ако нещо не е пълно просто да се допълваме.
В събота сигурно ще взема нещата от Емо и ще видя как ще се "запознаем" с Ардуиното. Че може да не си допаднем, знае ли човек.

pavel75

  • КЖМ - България
  • Trade Count: (18)
  • Hero Member
  • *****
  • Публикации: 1814
  • Рейтинг: 264
  • HO; IV и V; BDZ, BG; София
Re: Arduino за стрелки
« Отговор #48 -: 03 Ноември 2017, 12:31:38 »
Цитат на: emilchaushev link=topic=4987.msg108517#msg108517 date=1501167644
Сега ще сложа един малко по- сложен код за управление на сервото между 90 и 110 градуса, като в кода се вижда, че с декларирането и атачването се заема положение"Право" на стрелката.

Опитната постановка е за упраление с един бутон, свързан към пин 8 и серво на пин 9, като на пин 8 имаме оново резистор, който да държи масата. Всяко натискане на бутона води до превключване в противоположното положние на стрелката.
(Image removed from quote.)

================
КОД:

#include <Servo.h>

// константни променливи използвани за ъглите на сервото в градуси
const int straight = 90;
const int divergent = 110;

// Константни променлилви за пиновете, които се използват
const int buttonpin = 8;
const int servopin = 9;

// константа със стойност за забавяне на движението на сервото в милисекунди
const int step_delay = 70;

// декларираме сервото
Servo myservo; 
 
// глобални променливи за запомняне позицията на сервото
int pos = straight; // current
int old_pos = pos; // previous

void setup()
{
  // деклариране на пина за бутона
  pinMode(buttonpin, INPUT);
   
  // ето тук казваме директно след атачването да се обърне в права позиция сервото
  myservo.attach(servopin);  // attach to the servo on pin 9
  myservo.write(pos); // set the initial servo position
}

void loop()
{
 // всяка итерация започва с промяна на състоянието на бутона
 // при натиснат бутон (reads HIGH), се премества сервото
  int button_state = digitalRead(buttonpin);
  if(button_state == HIGH){
   
    old_pos = pos;   // запазва текущата позиция
   
    // променя позицията в обратното състояние
    pos = pos == straight ? divergent: straight;

       
    // премества сервото до новата позиция
    if(old_pos < pos){   // ако новия ъгъл е по- голям
      // завърта (увеличава) серво позицията от старото до новото състояние
      for(int i = old_pos + 1; i <= pos; i++){ 
        myservo.write(i); // записва следващата позиция на сервото
        delay(step_delay); // пауза
      }
    } else {  // обратно новия ъгъл е по- малък и ли равен
      // завърта (намалява) серво позицията
      for(int i = old_pos - 1; i >= pos; i--){
        myservo.write(i); // записва следващата позиция на сервото
        delay(step_delay); // пауза
      }
    }
   
  }
}// край на цикъла

Някой може ли да ми разясни потъмнения код?

pach

  • Trade Count: (42)
  • Hero Member
  • *****
  • Публикации: 12341
  • Рейтинг: 1327
  • ТТ & Н0; DR & BDZ;ep.I-III(~VI)&selfmade
    • За моделизма
Re: Arduino за стрелки
« Отговор #49 -: 03 Ноември 2017, 13:09:41 »
Щом казваш Митко... :scratch_ones_head:
Щом взеха да се виждат разправии на останалите, аз спирам до тук. :hi:

Павка, най-добре пробвай - не е сложно.
Ето ти едно възможно решение с "липсващите" честоти.
Впрочем драйверната платка е много приятно допълнение и е
за 16 канала. В кода е даден елементарен принцип на действие.
Ти ( вие) го обвържете с бутоните за всеки канал ( както по-горе
сте го описали). Под клипа има линкове и към библиотеката с
премерния код. Дори започва именно с инициалиализация на
честотите за различните ъгли в рамките на 50-те херца
( виж горния ми пост  диаграмата - периода е от тези 50 херца,
 а коефициента на запълване дава трите основни честоти за ъглите).
 Цената е " съвместима" с цената на платките с процесорчето и
драйвера.

Драйвера на платката има и други възможни функции
като например управление на стъпков двигател ( на мястото на
двата ДС мотора), а от него до управление на обръщателно кръг
са вече броени на пръсти оставащите стъпки.

Демонстрацията е с по-малък брой сервомашинки ( цифрови)
за това ползват адаптера. Бих препоръчал по-хубаво захранване за 16 машинки (SG90):
https://youtu.be/QjX4JKU_I9M
 
От тук нататък и аз като останалите очаквам да споделите
резултатите от пробите. Така е по-лесно явно.... :hi:
Успех!!!

mitko0888

  • Trade Count: (35)
  • Hero Member
  • *****
  • Публикации: 2416
  • Рейтинг: 1028
  • H0, еп. I, II, III, IV, София
    • Снимките ми ...
Re: Arduino за стрелки
« Отговор #50 -: 03 Ноември 2017, 13:50:58 »
Потъмненият код:
pos = pos == straight ? divergent: straight;
означава:

Ако pos е равно на straight, тогава pos става равно на divergent, иначе pos става равно на straight;

все едно имаш:
if (pos == straight)
    pos = divergent
else
    pos = straight

или казано на друг език:

if (a > b) {
    result = x;
} else {
    result = y;
}

може да се запише като:

result = a > b ? x : y;

« Последна редакция: 03 Ноември 2017, 13:53:58 от mitko0888 »

pavel75

  • КЖМ - България
  • Trade Count: (18)
  • Hero Member
  • *****
  • Публикации: 1814
  • Рейтинг: 264
  • HO; IV и V; BDZ, BG; София
Re: Arduino за стрелки
« Отговор #51 -: 03 Ноември 2017, 14:04:19 »
Благодарско, много разбираемо обяснение.
 :drinks:

mitko0888

  • Trade Count: (35)
  • Hero Member
  • *****
  • Публикации: 2416
  • Рейтинг: 1028
  • H0, еп. I, II, III, IV, София
    • Снимките ми ...
Re: Arduino за стрелки
« Отговор #52 -: 03 Ноември 2017, 14:25:15 »
Само да вметна: ако ще използваш готов код, а няма да си го пишеш сам, ето едно руско творение за три машинки с три бутона и едновременна работа, със запомняне във флеша. И със светодиоди. По добре почни от него, а не от началото.

говорил один мой знакомый: "Это баг, которы вовсе не баг, потому что в скрипах все правильно".
Грешу на сервы...
Сори, комменты кривые, особенно с реверсом, но думаю мысль понятна. Смысл тот же, что у местного ServoMotion.

Код:
//подключаемые библиотеки
#include <EEPROM.h>
#include <Bounce2.h>
#include <Servo.h>

//переменные конфигурации
int servoAngles[][2]={{0,90},{0,90},{0,90}}; // углы отклонения сервоприводов {"прямо", "в бок"}
byte servoReverce[]={0,0,0}; //реверс углов сервоприводов (если в положении "прямо" угол задан во втором элементе предыдущего массива, то поставить 1.)
int servoSpeed[]={10,10,10}; //скорость вращения сервопривода. указано количество миллисекунд поаорота на 1 градус

//переменные определяюще ножки подключения
int normalLed[]={8,10,12}; //ножки подключения светодиода показывающего прямое положение стрелки
int routeLed[]={9,11,13}; //ножки подключения светодиода показывающего положение стрелки "в бок"
int servoPins[]={3,5,6}; //ножки подключения провода управления сервопривода
int buttonPins[]={2,4,7}; //ножки подключения кнопок переключения

//переменные используемые при повороте сервопривода
byte CurrentPosition[]={0,0,0}; //текущее положение сервопривода. 0=прямо, 1=в бок.
int currentAngle[]={0,0,0};//текущий угол поворота сервопривода
unsigned long nextTime[]={0,0,0};// время следующего поворота на 1 градус
unsigned long currentTime; //текущее время
byte dir;// направление поворота сервопривода

//объекты сервоприводов и антидребезка кнопок
const int servos=sizeof(servoPins)/sizeof(int);
Servo servoServos[servos];
Bounce servoBouncer[servos];

void setup() {
  for(int i=0;i<servos;i++){
    pinMode(buttonPins, INPUT);
    servoBouncer = Bounce();
    servoBouncer.attach(buttonPins);
    servoBouncer.interval(5);
    pinMode(normalLed, OUTPUT);
    pinMode(routeLed, OUTPUT);
    if(EEPROM.read(i) > 1){
      EEPROM.update(i,0);
    }
    CurrentPosition=EEPROM.read(i);
    digitalWrite(normalLed, !CurrentPosition);
    digitalWrite(routeLed, CurrentPosition);
    servoServos.attach(servoPins);
    if(servoReverce){
      servoServos.write(servoAngles[!CurrentPosition]);
      currentAngle=servoAngles[!CurrentPosition];
    }
    else {
      servoServos.write(servoAngles[CurrentPosition]);
      currentAngle=servoAngles[CurrentPosition];
    }
  }
  delay(1000);
  for(int i=0;i<servos;i++){
    servoServos.detach();
  }
}

void loop() {
  currentTime=millis();
  for(int i=0;i<servos;i++){
    if(nextTime>0 && nextTime<currentTime){
      if(currentAngle>=servoAngles[0] && currentAngle<=servoAngles[1]){
        nextTime=currentTime+servoSpeed;
        if(servoReverce){
          dir=!CurrentPosition;
        }
        else {
          dir=CurrentPosition;
        }
        if(dir){
          currentAngle++;
        }
        else {
          currentAngle--;
        }
        if(servoAngles[1]/currentAngle == 2 || servoAngles[1]/currentAngle == 2.5 ){
          digitalWrite(normalLed, !CurrentPosition);
          digitalWrite(routeLed, CurrentPosition);
        }
        servoServos.write(currentAngle);
      }
      else{
        nextTime=0;
        servoServos.detach();
      }
    }
    if(servoBouncer.update()){
      if(servoBouncer.read()==LOW){
        CurrentPosition=!CurrentPosition;
        EEPROM.update(i,CurrentPosition);
        nextTime=currentTime;
        if(servoReverce){
          currentAngle=servoAngles[CurrentPosition];
        }
        else {
          currentAngle=servoAngles[!CurrentPosition];
        }
        servoServos.attach(servoPins);
      }
    }
  }
}

И клипче как работи: https://www.youtube.com/watch?v=akvCsXheF6A

В тмоя код не виждам къде превиш detach ...

pavel75

  • КЖМ - България
  • Trade Count: (18)
  • Hero Member
  • *****
  • Публикации: 1814
  • Рейтинг: 264
  • HO; IV и V; BDZ, BG; София
Re: Arduino за стрелки
« Отговор #53 -: 03 Ноември 2017, 14:35:11 »
Цитат на: mitko0888 link=topic=4987.msg109426#msg109426 date=1509711915
Само да вметна: ако ще използваш готов код, а няма да си го пишеш сам, ето едно руско творение за три машинки с три бутона и едновременна работа, със запомняне във флеша. И със светодиоди. По добре почни от него, а не от началото.

говорил один мой знакомый: "Это баг, которы вовсе не баг, потому что в скрипах все правильно".
Грешу на сервы...
Сори, комменты кривые, особенно с реверсом, но думаю мысль понятна. Смысл тот же, что у местного ServoMotion.

Код:
//подключаемые библиотеки
#include <EEPROM.h>
#include <Bounce2.h>
#include <Servo.h>

//переменные конфигурации
int servoAngles[][2]={{0,90},{0,90},{0,90}}; // углы отклонения сервоприводов {"прямо", "в бок"}
byte servoReverce[]={0,0,0}; //реверс углов сервоприводов (если в положении "прямо" угол задан во втором элементе предыдущего массива, то поставить 1.)
int servoSpeed[]={10,10,10}; //скорость вращения сервопривода. указано количество миллисекунд поаорота на 1 градус

//переменные определяюще ножки подключения
int normalLed[]={8,10,12}; //ножки подключения светодиода показывающего прямое положение стрелки
int routeLed[]={9,11,13}; //ножки подключения светодиода показывающего положение стрелки "в бок"
int servoPins[]={3,5,6}; //ножки подключения провода управления сервопривода
int buttonPins[]={2,4,7}; //ножки подключения кнопок переключения

//переменные используемые при повороте сервопривода
byte CurrentPosition[]={0,0,0}; //текущее положение сервопривода. 0=прямо, 1=в бок.
int currentAngle[]={0,0,0};//текущий угол поворота сервопривода
unsigned long nextTime[]={0,0,0};// время следующего поворота на 1 градус
unsigned long currentTime; //текущее время
byte dir;// направление поворота сервопривода

//объекты сервоприводов и антидребезка кнопок
const int servos=sizeof(servoPins)/sizeof(int);
Servo servoServos[servos];
Bounce servoBouncer[servos];

void setup() {
  for(int i=0;i<servos;i++){
    pinMode(buttonPins, INPUT);
    servoBouncer = Bounce();
    servoBouncer.attach(buttonPins);
    servoBouncer.interval(5);
    pinMode(normalLed, OUTPUT);
    pinMode(routeLed, OUTPUT);
    if(EEPROM.read(i) > 1){
      EEPROM.update(i,0);
    }
    CurrentPosition=EEPROM.read(i);
    digitalWrite(normalLed, !CurrentPosition);
    digitalWrite(routeLed, CurrentPosition);
    servoServos.attach(servoPins);
    if(servoReverce){
      servoServos.write(servoAngles[!CurrentPosition]);
      currentAngle=servoAngles[!CurrentPosition];
    }
    else {
      servoServos.write(servoAngles[CurrentPosition]);
      currentAngle=servoAngles[CurrentPosition];
    }
  }
  delay(1000);
  for(int i=0;i<servos;i++){
    servoServos.detach();
  }
}

void loop() {
  currentTime=millis();
  for(int i=0;i<servos;i++){
    if(nextTime>0 && nextTime<currentTime){
      if(currentAngle>=servoAngles[0] && currentAngle<=servoAngles[1]){
        nextTime=currentTime+servoSpeed;
        if(servoReverce){
          dir=!CurrentPosition;
        }
        else {
          dir=CurrentPosition;
        }
        if(dir){
          currentAngle++;
        }
        else {
          currentAngle--;
        }
        if(servoAngles[1]/currentAngle == 2 || servoAngles[1]/currentAngle == 2.5 ){
          digitalWrite(normalLed, !CurrentPosition);
          digitalWrite(routeLed, CurrentPosition);
        }
        servoServos.write(currentAngle);
      }
      else{
        nextTime=0;
        servoServos.detach();
      }
    }
    if(servoBouncer.update()){
      if(servoBouncer.read()==LOW){
        CurrentPosition=!CurrentPosition;
        EEPROM.update(i,CurrentPosition);
        nextTime=currentTime;
        if(servoReverce){
          currentAngle=servoAngles[CurrentPosition];
        }
        else {
          currentAngle=servoAngles[!CurrentPosition];
        }
        servoServos.attach(servoPins);
      }
    }
  }
}

И клипче как работи: https://www.youtube.com/watch?v=akvCsXheF6A

В тмоя код не виждам къде превиш detach ...

Малеееее, ти ме разби. Аз още се уча да различавам променлива от функция
Тук виждам нови за мен неща като - int normalLed[]={8,10,12};
До сега за мен декларирането беше int normalLed=8.
Сега тия скоби и нещата в тях ме хвърляш в оркестъра. Ама ще продължавам да чета.
Благодаря още веднъж.

mitko0888

  • Trade Count: (35)
  • Hero Member
  • *****
  • Публикации: 2416
  • Рейтинг: 1028
  • H0, еп. I, II, III, IV, София
    • Снимките ми ...
Re: Arduino за стрелки
« Отговор #54 -: 03 Ноември 2017, 14:58:42 »
Цитат на: pavel75 link=topic=4987.msg109427#msg109427 date=1509712511
Малеееее, ти ме разби. Аз още се уча да различавам променлива от функция
Тук виждам нови за мен неща като - int normalLed[]={8,10,12};
До сега за мен декларирането беше int normalLed=8.
Сега тия скоби и нещата в тях ме хвърляш в оркестъра. Ама ще продължавам да чета.
Благодаря още веднъж.

Нали са до три машинки - 0, 1 и 2

int normalLed[]={8,10,12};

все едно че имаш
normalLed[0]=8;
normalLed[1]=10;
normalLed[2]=12;


pavel75

  • КЖМ - България
  • Trade Count: (18)
  • Hero Member
  • *****
  • Публикации: 1814
  • Рейтинг: 264
  • HO; IV и V; BDZ, BG; София
Re: Arduino за стрелки
« Отговор #55 -: 03 Ноември 2017, 15:53:30 »
Цитат на: mitko0888 link=topic=4987.msg109428#msg109428 date=1509713922
Нали са до три машинки - 0, 1 и 2

int normalLed[]={8,10,12};

все едно че имаш
normalLed[0]=8;
normalLed[1]=10;
normalLed[2]=12;

Май вденах - става въпрос за масив.
Ще ми трябва повече време да го асимилирам.

pavel75

  • КЖМ - България
  • Trade Count: (18)
  • Hero Member
  • *****
  • Публикации: 1814
  • Рейтинг: 264
  • HO; IV и V; BDZ, BG; София
Re: Arduino за стрелки
« Отговор #56 -: 20 Ноември 2017, 11:19:22 »
Само да докладвам. Ардуиното дойде. Вчера почнах да го ръчкам. За сега карам един светодиод да премигва по мой команди. Тъй като това си е направо нищожно за това нищо не съм пуснал.

svetljjjo

  • Гост
  • Trade Count: (0)
Re: Arduino за стрелки
« Отговор #57 -: 22 Ноември 2017, 02:00:39 »
Ето тук има едно съвсем просто и лесно за разбиране примерче за серво
http://michaelsarduino.blogspot.bg/2017/03/servo-motor-mit-dem-arduino.html

И нещо за ардуино да кажа може и да го знаете но за тези които не го знаят да спомена
че чипа има ограничение за тока въпреки че пише че всеки изход осигурява макс 20mA
истината е че това е максималния ток за целия чип а не за всеки изход по отделно
За ардуино които са изградени с малките квадратни чипчета от типа TQFP/QFN/MLF
За оригиналното ардуино уно с големия чип тип PDIP му дават 40mA но това пак е за целия чип
Така че трябва да се внимава какво се закача на изходите особено с безобидните светодиотчета
щото една проста сметка ако имаш 10 светодиотчета по 3mA сещате се кво се получава  ;D

mitko0888

  • Trade Count: (35)
  • Hero Member
  • *****
  • Публикации: 2416
  • Рейтинг: 1028
  • H0, еп. I, II, III, IV, София
    • Снимките ми ...
Re: Arduino за стрелки
« Отговор #58 -: 22 Ноември 2017, 07:43:39 »
Светльо, това което си написал, не знам от къде го знаеш. Може да си го прочел в техн. спец. на производителя, най-добре в оригинал. Може да си го прочел и в някой блог или форум. Или някой да ти го е казал. Съветвам те да вярваш само на първото, освен ако не вярваш в дядо коледа. Иначе - представи си че 10 човека цитират твоя пост, и после някой каже че наистина е така, защото на 10 места пише че е така?

В ардуиното има един чип - ATmega328. Има техн. спец. на чипа, има и на ардуиното - пише точно и ясно: макс. ток на I/O pin - 40 мА. Консумация на самия процесор - от 2 до 19 мА (може и друго да пише) - в зависимост от конкретния чип, честота, SW и т.н. Макс. ток през GND или Vcc - 200 мА. Спокойно можеш да си вържеш 10 светодиода по 3 мА и заедно с чипа ще имаш не повече от 50 мА, при допустими 200.

pach

  • Trade Count: (42)
  • Hero Member
  • *****
  • Публикации: 12341
  • Рейтинг: 1327
  • ТТ & Н0; DR & BDZ;ep.I-III(~VI)&selfmade
    • За моделизма
Re: Arduino за стрелки
« Отговор #59 -: 22 Ноември 2017, 08:33:30 »
Нещо се е заблудил по невнимание.
Митко е съвсем прав. Виждал съм голямото ардуиното да върти по
четири сервомашинки без проблем.
Но все пак е хубаво когато се прави нещо за обща употреба,
тоест нещо различно от настоящето самообучение, да се купи
някоя от допълнителните платки ( известни още със звучната
"българска" дума - шилдове) за да е съвсем коректно употребата им.
Тук някъде нагоре бях показал такъв "шилд" точно за употребата с повече сервомашинки. Тоест тъкмо нещо като драйверната платка за нашите цели. Даже имаше опция с един ( или два) изхода за стъпкови електромотори.
Тоест хубавото е, че така можем да " вържем попа, за да е кротко селото"!!!
 ;D

ПП. " 16 channel servo shield for arduino "


Цена около 12$:
https://m.banggood.com/2-Channel-Motor-16-Channel-Servo-Expansion-Board-For-Arduino-UNO-Smart-Car-Chassis-Robot-Arm-p-1051594.html

Цитат
   
Работен ток Io: ≤1.2А
Максимална консумация на енергия:
4 W (T = 90 ℃)
Вход за управляващ сигнал:
 Високо ниво: 2.3V≤VIH≤VIN;
ниско ниво: -0.3V≤VIL≤1.5V
Работна температура:
-25 ℃ - + 125 ℃
Режим на задвижване:
Двойна голяма мощност H-мост драйвер ( буфер)
Тегло: около 46 грама

Включен пакет:
1 x 2-канала за DC  мотори
 ( или един общ канал за стъпков мотор)
 + 16-канален сервоусилвател 
« Последна редакция: 22 Ноември 2017, 08:48:32 от pach »