Електроника и Електротехника | Electronics and Electrical Engineering > Аналогово управление | Analog Control
Arduino за стрелки
mitko0888:
Ами тогава когато завъртиш сервото в единия край правиш EEPROM.update(0, 0), в другия край - EEPROM.update(0, 1);
При стартиране правиш EEPROM.read(0) и ако е 0 - палиш лампата за едната посока и правиш pos = pravo, ако е 1 - за другата посока и правиш pos = diasno.
Mixy:
--- Цитат на: VladoC link=topic=4987.msg110925#msg110925 date=1520189117 ---Сервото няма памет и не помни последната команда! След изключване на захранването, сервото остава в положението в което е било.
--- Край на цитат ---
И аз така си мисля, че трябва да е, обаче това
--- Цитат на: pavel75 link=topic=4987.msg110927#msg110927 date=1520194072 ---Сигурно аз не го обясних като хората. В момента като се възстанови захранването програмата винаги завърта сервото в положение "право" без значение къде е било преди това.
--- Край на цитат ---
ме хвърля в оркестъра.
:scratch_ones_head: :blink: :wacko:
Има някаква магия тука...
pavel75:
--- Цитат на: mitko0888 link=topic=4987.msg110928#msg110928 date=1520195237 ---Ами тогава когато завъртиш сервото в единия край правиш EEPROM.update(0, 0), в другия край - EEPROM.update(0, 1);
При стартиране правиш EEPROM.read(0) и ако е 0 - палиш лампата за едната посока и правиш pos = pravo, ако е 1 - за другата посока и правиш pos = diasno.
--- Край на цитат ---
Направих го, но ми дава грешка на потъмнения ред:
#include <Servo.h>
#include <EEPROM.h>
// константи за градусите на сервото
const int pravo = 0;
const int diasno = 90;
// константи за пиновете, които ще се използват
const int butonpin = 6;
const int servopin = 5;
const int led_pravo = 7;
const int led_otklonenie = 9;
// константа за периода на забавяне на върнете на сервото
const int period = 100;
//декрарираме сервото
Servo Strelka1;
//променливи за запомняне позицията на сервото
int pos = pravo; // текуща позиция
int pos_old = diasno; // предишна позиция
void setup() {
// изпълнява се веднъж при пускане на програмата
// декрарираме пиновете, които ще се ползват
pinMode (butonpin,INPUT);
pinMode (led_pravo, OUTPUT);
pinMode (led_otklonenie, OUTPUT);
// атачваме сервото и го караме да се обърне в права позиция
Strelka1.attach(servopin); // закача сервото на пин 5
if (EEPROM.read(0)=0)
{pos=pravo;
digitalWrite (led_pravo, HIGH);}
else {pos=diasno;
digitalWrite (led_otklonenie, HIGH);}
Strelka1.write(pos); //сервото се обръща в права позиция
delay (1000);
Strelka1.detach();
// настройка първоначален статус на светодиодите
//digitalWrite (led_pravo, HIGH);
//digitalWrite (led_otklonenie, LOW);
}
void loop() {
// изпълнява се постоянно
// с всяко натискане на бутона се променя позицията на сервото
int buton_push = digitalRead(butonpin);
if(buton_push ==HIGH){
// изключва светодиода за право
if(pos == pravo){
digitalWrite (led_pravo, LOW);}
else{
digitalWrite (led_otklonenie, LOW);
}
pos_old = pos; //запазва текущата позиция
if(pos==pravo)
{pos=diasno;}
else{pos=pravo;}
//pos=pos==pravo ? diasno:pravo; // променя позицията в обратно състояние
//Strelka1.attach(servopin);
if(pos_old<pos){
Strelka1.attach(servopin);
for(int i = pos_old + 1; i <=pos; i++){
Strelka1.write(i); // записва следващата позиция на сервото
delay(period); // забавяне
// Strelka1.detach();
}
Strelka1.detach();
EEPROM.update(0, 0);
}
//Strelka1.attach(servopin);
if(pos_old>pos){
Strelka1.attach(servopin);
for(int i = pos_old - 1; i >=pos; i--){
Strelka1.write(i); // записва следващата позиция на сервото
delay(period); // забавяне
// Strelka1.detach();
}
Strelka1.detach();
EEPROM.update(0, 1);
}
// Светва съответния пин
if (pos == pravo){
digitalWrite (led_pravo, HIGH);
}
else{
digitalWrite (led_otklonenie, HIGH);
}
}
}
svetljjjo:
Off-Topic:Аз там четох, но честно не можах да се ориентирам. Но друго ми направи впечатление - тази функция пише, че е ограничена по брой записи - 100 000 записа.
Това е абсолютно вярно и се отнася за всичко което има памет от типа флаш
флашки декодери пик контролери ардуинота и т.н.
а за грешката в тоя иф ти си направил присвояване а не проверка за сравнение трябва двойно равно ==
освен това присвояваш на отговор от функция
осен това библиотеката до колкото мога да видя от кода че не знам коя е си има променливи за позицията
и явно в .срр файла си има функций за писане и четене от епрома
вместо да се опитваш и ти да пишеш и то явно върху един и същ адрес
пробвай с проверка на pos_old това ще съдържа последното записано нещо преди изгасване на тока
като гледам тия редове
for(int i = pos_old + 1; i <=pos; i++){
for(int i = pos_old - 1; i >=pos; i--){
обаче то може да съдържа стойности явно от 0 до 90 ако е умрялно на 38 примерно кво правим
Това записва стъпките направени от сервото от 0 до 90 и обратно от 90 до 0
иначе кода ще работи така
// атачваме сервото и го караме да се обърне в права позиция
byte value;
value = EEPROM.read(0);
Strelka1.attach(servopin); // закача сервото на пин 5
if (value ==0)
svetljjjo:
Off-Topic:обаче то може да съдържа стойности явно от 0 до 90 ако е умрялно на 38 примерно кво правим
Това записва стъпките направени от сервото от 0 до 90 и обратно от 90 до 0
сори направил съм грешнен извод стойностите са само две 0 и 90 то ги записва чак след като излезе от цикъла
;D
Навигация
[0] Списък на темите
Премини на пълна версия