Електроника и Електротехника | Electronics and Electrical Engineering > Аналогово управление | Analog Control

Arduino за стрелки

<< < (27/38) > >>

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] Списък на темите

[#] Следваща страница

[*] Предходна страница

Премини на пълна версия