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

Mixy

  • КЖМ - България
  • Trade Count: (3)
  • Hero Member
  • *****
  • Публикации: 1538
  • Рейтинг: 384
    • SCARM - българският софтуер за дизайн на релсови планове и жп макети
Re: Arduino за стрелки
« Отговор #120 -: 03 Март 2018, 22:04:31 »
404 - File not found.

pavel75

  • КЖМ - България
  • Trade Count: (18)
  • Hero Member
  • *****
  • Публикации: 1812
  • Рейтинг: 264
  • HO; IV и V; BDZ, BG; София
Re: Arduino за стрелки
« Отговор #121 -: 03 Март 2018, 22:07:58 »

Mixy

  • КЖМ - България
  • Trade Count: (3)
  • Hero Member
  • *****
  • Публикации: 1538
  • Рейтинг: 384
    • SCARM - българският софтуер за дизайн на релсови планове и жп макети
Re: Arduino за стрелки
« Отговор #122 -: 03 Март 2018, 23:27:32 »
Сега е ОК  :)

pavel75

  • КЖМ - България
  • Trade Count: (18)
  • Hero Member
  • *****
  • Публикации: 1812
  • Рейтинг: 264
  • HO; IV и V; BDZ, BG; София
Re: Arduino за стрелки
« Отговор #123 -: 04 Март 2018, 08:51:01 »
Остана ми да разреша още един проблем. В момента платката работи като часовник - при включване застава в положение "право", светодиодите показват коректно посоката на сервото, самото серво е включено само когато се върти.
Обаче нещо ме мъчи. Сутрин като започва срещата и включа захранването стрелките ще застанат в първоначално положение. Тук драма няма. Драмата, е когато по време на срещата мигне тока - тогава всички стрелки ще застанат в основно положение и ако минава в този момент влак ще стане неприятно.
Гледах различни кодове, но не мога да разбера добре библиотеката EEPROM. Виждам, че чрез нея се запомня текущото положение в секцията loop на програмата, а в setup се използва да се завърти сервото на тази позиция запомнена от библиотеката, а не както аз правя - винаги в права позиция.
Някой дали е запознат с тази библиотека да ми подскаже, с някой прост пример как се работи с нея? Ще съм изключително благодарен.

svetljjjo

  • Гост
  • Trade Count: (0)
Re: Arduino за стрелки
« Отговор #124 -: 04 Март 2018, 16:26:47 »
в самата програма има примери за <EEPROM.h>
за Ардуино 1,8,5  от менюто файл-примери- примери за ардуино генй и уно - това е третата секция
пирвия елемент от нея е точно EEPROM
и там има всичко основно изтриване четене записване

pavel75

  • КЖМ - България
  • Trade Count: (18)
  • Hero Member
  • *****
  • Публикации: 1812
  • Рейтинг: 264
  • HO; IV и V; BDZ, BG; София
Re: Arduino за стрелки
« Отговор #125 -: 04 Март 2018, 19:52:40 »
Цитат на: svetljjjo link=topic=4987.msg110921#msg110921 date=1520173607
в самата програма има примери за <EEPROM.h>
за Ардуино 1,8,5  от менюто файл-примери- примери за ардуино генй и уно - това е третата секция
пирвия елемент от нея е точно EEPROM
и там има всичко основно изтриване четене записване

Аз там четох, но честно не можах да се ориентирам. Но друго ми направи впечатление - тази функция пише, че е ограничена по брой записи - 100 000 записа.

mitko0888

  • Trade Count: (35)
  • Hero Member
  • *****
  • Публикации: 2385
  • Рейтинг: 970
  • H0, еп. I, II, III, IV, София
    • Снимките ми ...
Re: Arduino за стрелки
« Отговор #126 -: 04 Март 2018, 19:53:53 »
Това eeprom.h го има в сайта. Има едно read и е дно write. Като им даваш адрес къде да се чете и пише. Има го в последния файл. Има го и в примера на стр. 3, който аз изкопирах.

Ама я ми кажи за какво е това? Мърдаш сервото и всеки път записваш във флеша в какво положение е стрелката. Гасиш, пускаш. И караш сервото да се върти пак до там. Ами нали последно си го оставил там, при пускане на стрелката не и трябва да и даваш никакви команди, тя си е там където си я оставил.

Ами след като си угасил, и после пускаш наново, ако някой отиде да върти сервото на ръка, че да го премести? И да го премести, ти ще прочетеш къде си записал че е стрелката, а не къде в действителност е.

Така че това с eeprom върши работа само за начално светване на правилната лампа за посока, и то не според къде е стрелката, а според къде последно си записал че трябва да е.

Най-доброто е това, което ти написа Милен - в началото четеш ключетата, светваш си правилната лампа за посока и си задаваш правилното начално положение в променливите в програмата. БЕЗ да мърдаш стрелката и да я слагаш в някакво начлно положение. Ако не ти се харчат крачета за входове, можеш винаги при стартиране да не я движиш въобще, и да не палиш никаква лампа. Да отиде човек на място, да види че отгоре няма влак и да натисне някой от бутоните. Тогава всичко да си отиде където искаш и да светне както трябва.

Може и при включване да я мърдаш в "нормалното" и положение, или плюсовата посока. 

Mixy

  • КЖМ - България
  • Trade Count: (3)
  • Hero Member
  • *****
  • Публикации: 1538
  • Рейтинг: 384
    • SCARM - българският софтуер за дизайн на релсови планове и жп макети
Re: Arduino за стрелки
« Отговор #127 -: 04 Март 2018, 20:23:52 »
Аз нещо се обърках. От това, което пише Павката излиза, че има някаква обратна връзка или че сервото "знае" на колко градуса е завъртяно и след изключване на тока. И при включване, винаги се установява в правилната посока (условно "направо" за стрелките или на 0 градуса). Така ли е или пак нещо не съм разбрал?  :blush2:


Колкото до проблема с премигването на тока или дори спирането за по-дълго време, най-лесното решение е самото ардуино да бъде двойно захранено - нормално и през батерия (като лаптопите). Трябва все пак да се сметне и каква ще е консумацията при работеща програма за да е ясно колко минути ще издържи дадената батерия.
« Последна редакция: 04 Март 2018, 20:34:51 от Mixy »

VladoC

  • Trade Count: (0)
  • Jr. Member
  • **
  • Публикации: 64
  • Рейтинг: 42
Re: Arduino за стрелки
« Отговор #128 -: 04 Март 2018, 20:45:17 »
Сервото няма памет и не помни последната команда!
След изключване на захранването, сервото остава в положението в което е било.
При включване на захранването, без входен сигнал, сервото не променя положението си.
Сервото няма обратна връзка и Ардуиното не може да прочете нищо от него!
Занимавам се с корабо- и авиомоделизъм от 30 години и не съм срещал серва с памет и обратна връзка.
Все пак има съвременни серва с памет - failsafe, която се програмира чрез апаратурата за управление или чрез специален програматор. Тук за такива серва не става въпрос.
 

pavel75

  • КЖМ - България
  • Trade Count: (18)
  • Hero Member
  • *****
  • Публикации: 1812
  • Рейтинг: 264
  • HO; IV и V; BDZ, BG; София
Re: Arduino за стрелки
« Отговор #129 -: 04 Март 2018, 22:07:52 »
Цитат на: mitko0888 link=topic=4987.msg110923#msg110923 date=1520186033
Това eeprom.h го има в сайта. Има едно read и е дно write. Като им даваш адрес къде да се чете и пише. Има го в последния файл. Има го и в примера на стр. 3, който аз изкопирах.

Ама я ми кажи за какво е това? Мърдаш сервото и всеки път записваш във флеша в какво положение е стрелката. Гасиш, пускаш. И караш сервото да се върти пак до там. Ами нали последно си го оставил там, при пускане на стрелката не и трябва да и даваш никакви команди, тя си е там където си я оставил.

Ами след като си угасил, и после пускаш наново, ако някой отиде да върти сервото на ръка, че да го премести? И да го премести, ти ще прочетеш къде си записал че е стрелката, а не къде в действителност е.

Така че това с eeprom върши работа само за начално светване на правилната лампа за посока, и то не според къде е стрелката, а според къде последно си записал че трябва да е.

Най-доброто е това, което ти написа Милен - в началото четеш ключетата, светваш си правилната лампа за посока и си задаваш правилното начално положение в променливите в програмата. БЕЗ да мърдаш стрелката и да я слагаш в някакво начлно положение. Ако не ти се харчат крачета за входове, можеш винаги при стартиране да не я движиш въобще, и да не палиш никаква лампа. Да отиде човек на място, да види че отгоре няма влак и да натисне някой от бутоните. Тогава всичко да си отиде където искаш и да светне както трябва.

Може и при включване да я мърдаш в "нормалното" и положение, или плюсовата посока.

Сигурно аз не го обясних като хората.
В момента като се възстанови захранването програмата винаги завърта сервото в положение "право" без значение къде е било преди това.
А ми се иска обратното - сервото да не мърда, а светодиодите да светнат правилно - ако е било в право при изгасването - да светне този диод и обратното. Точно както е на онзи руския пример дето си дал.

mitko0888

  • Trade Count: (35)
  • Hero Member
  • *****
  • Публикации: 2385
  • Рейтинг: 970
  • H0, еп. I, II, III, IV, София
    • Снимките ми ...
Re: Arduino за стрелки
« Отговор #130 -: 04 Март 2018, 22:27:17 »
Ами тогава когато завъртиш сервото в единия край правиш  EEPROM.update(0, 0), в другия край -  EEPROM.update(0, 1);
При стартиране правиш EEPROM.read(0) и ако е 0 - палиш лампата за едната посока и правиш pos = pravo, ако е 1 - за другата посока и правиш pos = diasno.

Mixy

  • КЖМ - България
  • Trade Count: (3)
  • Hero Member
  • *****
  • Публикации: 1538
  • Рейтинг: 384
    • SCARM - българският софтуер за дизайн на релсови планове и жп макети
Re: Arduino за стрелки
« Отговор #131 -: 04 Март 2018, 23:16:34 »
Цитат на: VladoC link=topic=4987.msg110925#msg110925 date=1520189117
Сервото няма памет и не помни последната команда! След изключване на захранването, сервото остава в положението в което е било.

И аз така си мисля, че трябва да е, обаче това

Цитат на: pavel75 link=topic=4987.msg110927#msg110927 date=1520194072
Сигурно аз не го обясних като хората. В момента като се възстанови захранването програмата винаги завърта сервото в положение "право" без значение къде е било преди това.

ме хвърля в оркестъра.

:scratch_ones_head:  :blink:   :wacko:

Има някаква магия тука...

pavel75

  • КЖМ - България
  • Trade Count: (18)
  • Hero Member
  • *****
  • Публикации: 1812
  • Рейтинг: 264
  • HO; IV и V; BDZ, BG; София
Re: Arduino за стрелки
« Отговор #132 -: 04 Март 2018, 23:28:55 »
Цитат на: 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

  • Гост
  • Trade Count: (0)
Re: Arduino за стрелки
« Отговор #133 -: 05 Март 2018, 01:32:57 »
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

  • Гост
  • Trade Count: (0)
Re: Arduino за стрелки
« Отговор #134 -: 05 Март 2018, 04:08:35 »
Off-Topic:
обаче то може да съдържа стойности явно от 0 до 90 ако е умрялно на 38 примерно кво правим
Това записва стъпките направени от сервото от 0 до 90 и обратно от 90 до 0
сори направил съм грешнен извод стойностите са само две 0 и 90 то ги записва чак след като излезе от цикъла
 ;D