Arduino Polska Forum

Pełna wersja: Odczyt pozycji
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Witam, 
proszę was o pomoc, próbuję zrealizować następujący układ. 
Chcę sterować serwem za pomocą potencjometru, po przyciśnięciu przycisku arduino powinno zapisywać ruchy serwa, aby po ponownym naciśnięciu przycisku odtworzyć zapisaną sekwencję ruchów. Cały problem polega na tym że w momencie kiedy serwo powinno powtórzyć sekwencję ruchów, ono powtarza tylko jeden. Wydaje mi się ze odczytuje ono tylko pierwszą pozycję zapisaną w tabeli, czy mógłby ktoś to zweryfikować? Oto kod: 

Kod:
#include <Servo.h>
Servo test;
int AnalogOut = 0;
int NewAnalogOut = 0;
int pin_Button = 12;
int pin_Button_State = 0;
int pin_Button_State_Last = 0;
int storage[800];
int storage_loc = 0;
int recording = 0;

void setup() {
 Serial.begin(9600);
 test.attach(11);
 pinMode(pin_Button, INPUT);
}
// testing
void loop() {
 pin_Button_State = digitalRead(pin_Button);
 if (pin_Button_State != pin_Button_State_Last) {
   if (pin_Button_State == HIGH) {
     recording++;
     if (recording == 2) {
       storage[storage_loc] = 777;
     }
   }
   delay(50);
 }
 pin_Button_State_Last = pin_Button_State;
 
 if (recording == 0) {
 int sensorValue = analogRead(A0);
 NewAnalogOut = map(sensorValue, 0, 1023, 0, 180);
 if (abs(NewAnalogOut - AnalogOut) > 2) {
   test.write(AnalogOut);
   AnalogOut = NewAnalogOut;
 }
 }
 delay(1);
 if ( recording == 1) {
   recording = 1;
   int sensorValue = analogRead(A0);
 NewAnalogOut = map(sensorValue, 0, 1023, 0, 180);
 if (abs(NewAnalogOut - AnalogOut) > 2) {
   test.write(AnalogOut);
   AnalogOut = NewAnalogOut;
 }
   if (storage_loc < 800) {
     storage[storage_loc] = NewAnalogOut;
     delay(100);
     Serial.println(storage_loc);
     storage_loc++;
   }
 } else if (recording > 1) {
   while (1 == 1) {
   storage_loc = 0;
   if (storage_loc < 800 || storage[storage_loc] != 777) {
     
     test.write(storage[storage_loc]);
     
     delay(100);
   }
   }
 }
Dodałem u siebie linijkę
Kod:
Serial.println(storage_loc);

po warunku "else if" i na monitorze portu pokazują mi się wartości 0. Rozumiem że arduino odczytuje tylko pierwszą komórkę tabeli, czyli problem jest gdzieś tu:
Kod:
else if (recording > 1) {
   while (1 == 1) {
   storage_loc = 0;
   if (storage_loc < 800 || storage[storage_loc] != 777) {
     
     test.write(storage[storage_loc]);
     
     delay(100);

Ktoś podpowie jak poprawnie powinien wyglądać ten kod aby były odczytywane kolejne wartości z tabeli a nie tylko pierwsza?
Poproszę o komentarze w kodzie.
Opisz działanie tego programu, po kolei co robi każda linia kodu.

W jaki sposób to coś
Kod:
else if (recording > 1) {
  while (1 == 1) {
  storage_loc = 0;
  if (storage_loc < 800 || storage[storage_loc] != 777) {
   
    test.write(storage[storage_loc]);
   
    delay(100);
miało by odtworzyć zawartość tablicy?
Mała podpowiedź: skoro storage_loc =0, to ewidentnie zawsze serwo będzie stało w miejscu.
Podpowiedź nr2: nie kopiuj bezmyślnie kodu z internetu. Jeśli coś jest w sieci, to nie znaczy że działa.
Ogólna zasada jest taka 98% zawartości internetu do spam.
Strasznie rozrzutny jesteś, deklarujesz
Kod:
int storage[800];
zamiast
Kod:
byte storage[800];
przez co możesz zapisać dwa razy mniej próbek. Jest to o tyle istotne, ze większość popularnych Arduino ma śladowe ilości pamięci RAM, pamięci, która jest potrzebna także na stos i stertę.
(22-05-2018, 10:09)es2 napisał(a): [ -> ]Strasznie rozrzutny jesteś, deklarujesz
Kod:
int storage[800];
zamiast
Kod:
byte storage[800];
przez co możesz zapisać dwa razy mniej próbek. Jest to o tyle istotne, ze większość popularnych Arduino ma śladowe ilości pamięci RAM, pamięci, która jest potrzebna także na stos i stertę.

Dopiero się uczę, jestem trochę zielony, dziękuję za cenną radę Wink Program jest napisany dla jednego serwa ale domyślnie będą cztery. Program ma sterować ramieniem robotycznym, zapamiętywać i powielać ruchy. Faktycznie próbek było mało, musiałem zmniejszyć częstotliwość próbkowania do 150ms przez co praca nie była tak płynna jak bym chciał. 
Poza tym temat do zamknięcia już rozwiązałem swój problem.
(22-05-2018, 12:52)kh94 napisał(a): [ -> ]Faktycznie próbek było mało, musiałem zmniejszyć częstotliwość próbkowania do 150ms przez co praca nie była tak płynna jak bym chciał.

Daj zewnętrzna pamięć FRAM