Електроника и Електротехника | Electronics and Electrical Engineering > Аналогово управление | Analog Control
Arduino за стрелки
mitko0888:
Потъмненият код:
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;
pavel75:
Благодарско, много разбираемо обяснение.
:drinks:
mitko0888:
Само да вметна: ако ще използваш готов код, а няма да си го пишеш сам, ето едно руско творение за три машинки с три бутона и едновременна работа, със запомняне във флеша. И със светодиоди. По добре почни от него, а не от началото.
говорил один мой знакомый: "Это баг, которы вовсе не баг, потому что в скрипах все правильно".
Грешу на сервы...
Сори, комменты кривые, особенно с реверсом, но думаю мысль понятна. Смысл тот же, что у местного 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:
--- Цитат на: 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:
--- Цитат на: 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;
Навигация
[0] Списък на темите
Премини на пълна версия