Arduino - projekti, ideje, savjeti, problemi izdvojena tema

poruka: 1.215
|
čitano: 159.464
|
moderatori: DrNasty, Danny_HR, pirat, XXX-Man, Lazarus Long, vincimus
+/- sve poruke
ravni prikaz
starije poruke gore
Ova tema je sadržajno povezana sa sljedećim temama: Uvod u elektrotehniku (istosmjerna struja)
7 dana
offline
Arduino - projekti, ideje, savjeti, problemi

Zamolio bih poznavatelje programiranja Arduino aplikacije da pogledaju ovaj Sketch i upute me gdje griješim. Naime želio bih napraviti napravu kojom bih mogao raditi slijedeće. Kad se preko tastature unese neki broj, isti je vidljiv na LCD-u. Kad se pritisne tipka 1,stepper motor napravi koraka koliko je određeno naredbom myStepper.step Unesena vrijednost mora ostati spremljena u EEPROM. Trenutno nije bitno da se kontra smijer upravlja sa vrijednostima sa tastature. Kontra smijer se može postavit programski i uvijek je isti.

(imajte u vidu da sam ja skoro šezdesetgodišnjak i da mnoge stvari mi nisu baš sjele).

 

platforma je ARDUINO UNO V.3

 

// program za pokretanje step motora napred nazad
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <Stepper.h> //including stepper motor library
#include <EEPROM.h>

int button1Pin = A0; // (u ovoj verziji koda koristi se analogni ulaz kao digitalni)
int button2Pin = A1; // (u ovoj verziji koda koristi se analogni ulaz kao digitalni)
int stepIN1Pin = 10;
int stepIN2Pin = 13;
int stepIN3Pin = 12;
int stepIN4Pin = 11;
int stepsPerRevolution = 2060; // amount of steps per revolution

//char password[4];
char dist[4];
int j=0;
char customKey=0;

 

const byte ROWS = 4;
const byte COLS = 4;

char hexaKeys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3, 2};
Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
LiquidCrystal_I2C lcd(0x27, 16, 2);
Stepper myStepper(stepsPerRevolution, stepIN2Pin, stepIN4Pin, stepIN3Pin, stepIN1Pin);
void setup(){
pinMode(button1Pin, INPUT);
pinMode(button2Pin, INPUT);
myStepper.setSpeed(15);
lcd.backlight();
lcd.init();
}
void loop(){
char customKey = customKeypad.getKey();
if (customKey){

//lcd.clear();
lcd.setCursor(0,0);
// lcd.print(customKey);
for(int j=0;j<4;j++)
EEPROM.write(j,customKey);
for(int j=0;j<4;j++)

dist[j]=EEPROM.read(j);
//j=EEPROM.read(j);

lcd.print( dist[j]);
}
{
int button1State, button2State;
button1State = digitalRead(button1Pin);
button2State = digitalRead(button2Pin);
// for(int j=0;j<4;j++)
// dist[j]=EEPROM.read(j);
// lcd.clear();

// lcd.print( dist[j]);

if (((button1State == LOW) && !(button2State == LOW))) // if we're pushing button 1 OR button 2
myStepper.step(-stepsPerRevolution* dist[j]);  // ova naredba ne radi motor se uvijek vrti 10 revolucija bez obzira na vrijednost tastature
// myStepper.step(stepsPerRevolution*2);     // ova naredba radi ali ne očitava vrijednost sa tastature
if (((button2State == LOW) && !(button1State == LOW))) // if we're pushing button 1 OR button 2
myStepper.step(-stepsPerRevolution/2);



}
}

 
0 0 hvala 0
7 godina
offline
Re: Arduino - projekti, ideje, savjeti, problemi

Neke stvari mi nisu jasne:

sa funkcijom 

char customKey = customKeypad.getKey();

dobiješ vrijednost tastature, koja je char (veličina 8 bitova=1 byte)

a funkcija EEPROM.write(j,customKey);

to zapiše na 4 mjesta u eeprom? zašto?

i onda opet to sve poročitaš i zapišeš u polje dist[j]=EEPROM.read(j);

 

i onda zavrtiš motor naredbom 

myStepper.step(-stepsPerRevolution* dist[j]);?

pitanje je koja je vrijednost tu dist[j]? vrijednost varijable "j" ti je j u tom trenutku 4 i na polju dist[4] nemaš ništa zapisano.

probaj stavit fiksno dist[0], znači vrijednost koja je zapisana na prvu adresu u EEPROM-u. ili stavi j=0; nakon što pročitaš stanje tipkala.

i mislim da imaš višak zagrada (linija 60 i 78)

 

Pozdrav!

7 dana
offline
Re: Arduino - projekti, ideje, savjeti, problemi

Ma nisam ja programer. Ovo sam skalupio od nekoliko primjera koje sam pronašao na internetu i kombinacijom određenih naredbi probao napravit program koji bi mi nakon pritiska na tipku pomknuo radnu traku za onoliko mm koliko napišem pomoću tastature. Zapeo sam na ovom dijelu gdje je trebalo pročitat vrijednost u memoriji i tu vrijednost ubacit u naredbu

 

 

myStepper.step(-stepsPerRevolution* dist[j]);

 

pokušao sam na par načina ali nisam uspio. Probat ću kasnije napravit ove preinake pa javim što sam dobio. inaće cijela ideja je na skici.

 

Meni bi ustvari trebalo da ja mogu upisat neku vrijednost i recimo stisnem tipku "A" i to se umemorira. Dlje je postupak kao što sam gore napisao, ali nisam uspio dobit dvocifrenu ili trocifrenu vrijednost  upisa preko keypad-a već mi svaki put  prikaže samo jednocifreni broj. Znaći imam dosta problema (zbog mog neznanja) ali pokušavam riješiti dio po dio. Kao što rekoh stariji sam čovjek i nisam vičan programiranju ali eto pokušavam naučit nešto novijega osim tranzistora i elktronskih cijevi.

 

Poruka je uređivana zadnji put sri 11.9.2019 10:52 (hrmnk).
7 godina
offline
Re: Arduino - projekti, ideje, savjeti, problemi

Ajmo prvo definirati šta upisujemo preko tastature? samo brojeve?

koji je raspon tih brojeva? Da li nakon unosa na tipkovnici imaš potvrdu unosa (nekakav oblik enter tipke)?

 

 

7 dana
offline
Re: Arduino - projekti, ideje, savjeti, problemi

Da recimo želim da se traka pomakne 50 mm upišem 50 i svaki put kad stisnem tipku motor se pomakne za taj iznos. znači u samom kodu treba postojati naredba koja će taj broj pretvorit u broj koraka motora. Broj koraka po punom okretu motora je poznat, Opseg kruga valjka koji pokreće traku isto je poznat. mislim poznat . Za sad je to samo imaginarna vrijednost ali recimo ti parametri se postave na neku stvarnu vrijednost i ne mijenjaju se. Osim same dužine pomaka. Za to mi je dovoljna trocifrena vrijednost dužine koju sam upisujem preko tastature. U stvari to je i jedini parametar koji mora biti promjenjiv. Bilo bi super kad bi se ta upisana vrijednost dala memorirati i po potrebi mijenjati. 

 

Npr.

 

235 utipkam na tastaturi pa recimo "A" i to je spremljeno. Kad pritisnem taster motor napravi koraka taman toliko da se transportna traka pomakne za 235mm, ili neku drugu vrijednost koja je napisana preko tastature. Znači imam mogučnost beskonačnog ponavljanja postupka svaki put kad pritisnem tipkalo a da prije toga ne moram ponovno upisivati recimo ovih 235 ili slično. znaći upisujem od 1 do 999 ili 001 do 999 već kako to programski mora biti . sada recimo želim promjeniti vrijednost. Pritisnem npr "#" i upišem novu vrijednost, recimo 025 ili 25 stisnem "A" i ta nova vrijednost je aktivna sve do ponovne promjene. Recimo takav nekakav način rada step motora. Druga tipka se koristi za kontra smjer vrtnje i nije uvjetovana nikakvim upisivanjima. tj. kad je držim stisnutu motor se vrti kontra sve dok ju ne otpustim.

 

Konkretno u mom slućaju motor treba 2060 koraka za jedan okretaj. Recimo da je opseg valjka i trake 100mm (50mm za pola kruga), kad upišem preko tastature 50, motor treba napraviti 1030 koraka.

Poruka je uređivana zadnji put sri 11.9.2019 14:31 (hrmnk).
7 godina
offline
Re: Arduino - projekti, ideje, savjeti, problemi

Evo novi kod koji nije testiran, ali u teoriji bi trebao funkcionirati.

Definicije pinova i LCD-a nisam ništa dirao.

Ono što sam uveo je prilikom setup-a da pročita zadnju spremljenu vrijednost u eeprom-u i da bude spreman za rad. moglo bi biti problema prilikom prvog paljena, jer neznam koje su mu default vrijednostu u eeprom-u.

dodao sam i prepoznavanje tipki za unos i potvrdu unosa.

program čeka unos tipke i kad se unese "#" ulazi u programobilni mod (ispisuje na lcdu ""enter dist:", te u donjem redu ispisuje tipke koje se kasnije unose.

daljnim unosom znamenki svaka se zapisuje u polje "digits []" sve dok se na tipkovnici ne pritisne "A".

kada se pritisne "A", unešene znamenke se spremaju u eeprom, svaka znamenka na svoju poziciju (to bi se moglo i bolje riješiti) i generira se varijabla "distance" koja će iz unešenih znamenki napraviti broj koji je od 0-999.

nakon toga pritiskom na tipkala okreces traku. jedino što ces ti ubaciti korekcijski faktor u kod tako da brojeve od 0-999 konvertiraš u centimetre.

 

myStepper.step(-stepsPerRevolution* distance*"korekcijski_faktor");

 

 

Molim ekipu na forumu, ako ima kakvih primjedbi i sugestija nek se slobodno uključe u problematiku.

 

 

 

 

// program za pokretanje step motora napred nazad
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <Stepper.h> //including stepper motor library
#include <EEPROM.h>

int button1Pin = A0; // (u ovoj verziji koda koristi se analogni ulaz kao digitalni)
int button2Pin = A1; // (u ovoj verziji koda koristi se analogni ulaz kao digitalni)
int stepIN1Pin = 10;
int stepIN2Pin = 13;
int stepIN3Pin = 12;
int stepIN4Pin = 11;
int stepsPerRevolution = 2060; // amount of steps per revolution

//char password[4];
char dist[4];
int j=0;
char customKey=0;

 

const byte ROWS = 4;
const byte COLS = 4;

char hexaKeys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3, 2};
Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
LiquidCrystal_I2C lcd(0x27, 16, 2);
Stepper myStepper(stepsPerRevolution, stepIN2Pin, stepIN4Pin, stepIN3Pin, stepIN1Pin);

void setup(){
pinMode(button1Pin, INPUT);
pinMode(button2Pin, INPUT);
myStepper.setSpeed(15);
lcd.backlight();
lcd.init();
const byte entryMaxSize = 3; //maksimalan broj znamenki 0-999
static char digits[entryMaxSize + 1]; // array gdje cemo spremati unešene znamenke, treba nam još jedno ekstra mjesto za znak za terminaciju "\0"
bool a = true; // varijabla koja označava unošenje broja

//čitanje iz eeproma zadnju spremljenu vrijednost; kad se arduino upali da ostane na zadnjoj podešenoj vrijednosti
for(int i=0;i<entryMaxSize;i++){
digits[i]=EEPROM.read(i);
}
long int distance = atol(digits); //konverzija unešenih znakova u jednu brojku
//ispisivanje učitanih vrijednosti
lcd.clear();
lcd.print("Dist set:");
lcd.setCursor(0, 1); //lcd u drugi red
for (i = 0; i < entryMaxSize; i++) {
lcd.print(digits[i]);
}
}


void loop(){
static byte x; // index znamnki

char key = keypad.getKey();
if (key != NO_KEY) // Check for a valid key.
{
switch (key)//prouči malo switch-case funkcije u C-u... ako imaš vremena i volje učiti 
{
case '#': //ako je unešena znamenka "#"
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("enter dist:");
lcd.setCursor(0, 1); //lcd u drugi red
x = 0; // reset the position of array
a = true;
break;

case 'A':
if (a) // ako je u programibilnom modu
{
lcd.clear();
lcd.print("Dist set:");
lcd.setCursor(0, 1); //lcd u drugi red
for (i = 0; i < entryMaxSize; i++)
{
lcd.print(digits[i]);
EEPROM.write(i,digits[i]);
}
a = false; // izlaz iz programibilnog moda
long int distance = atol(digits); //konverzija unešenih znakova u jednu brojku

}
}
break;

default:
if (a)// ako je u programibilnom modu
{
// add key to userinput array and increment counter
if ( key >= '0' && key <= '9' ){ // key is of type char and has a value between 0 and 9 so do something with it.
digits[x++] = key; //zapisujemo pritisnutu vrijednost na poziciju x, te povecavamo poziciju da bi upisali sljedeću znamenku
digits[x] = '\0';
lcd.print( key ) ; // new print statement <<<<<<<<<<<<<<<<
}
}
break;
}
}

if (((button1State == LOW) && !(button2State == LOW))) // if we're pushing button 1 OR button 2
myStepper.step(-stepsPerRevolution* distance); // tu još unesi korekcijski faktor (ako je potrebno)
if (((button2State == LOW) && !(button1State == LOW))) // if we're pushing button 1 OR button 2
myStepper.step(-stepsPerRevolution/2);
}

7 dana
offline
Re: Arduino - projekti, ideje, savjeti, problemi

Probao sam ga verificirat ali mi izbacuje sljedeću poruku 'i' was not declared in this scope

 

for (i = 0; i < entryMaxSize; i++)  //ovdje ne znam da li dolazi ; na kraju. kad sm to stavio ond mi poruku prebacuje na sljedeći red //

lcd.print(digits[i]);

 

 

Poruka je uređivana zadnji put sri 11.9.2019 19:00 (hrmnk).
7 dana
offline
Re: Arduino - projekti, ideje, savjeti, problemi

Da li je ovo dobro jer 'j' više nigdje ne nalazim u kodu.

 

Kad promjenim j u i onda dobijem ovu drugu poruku

7 godina
offline
Re: Arduino - projekti, ideje, savjeti, problemi

ispravak u liniji 18:

int i=0;

ispravak u liniji 66:

char key = customKeypad.getKey();

 

iza one for petlje ne ide ; ta petlja služi za ispis znamenki

 

7 dana
offline
Re: Arduino - projekti, ideje, savjeti, problemi

Ispravio sam 

 

Sad mi se ovo pojavilo .

 

 

Poruka je uređivana zadnji put čet 12.9.2019 3:17 (hrmnk).
7 godina
offline
Re: Arduino - projekti, ideje, savjeti, problemi

ajde prebaci linije koje se nalaze u setup() funkciji izvan nje.

znači prebaci sljedeće tri linije:

const byte entryMaxSize = 3; //maksimalan broj znamenki 0-999

static char digits[entryMaxSize + 1]; // array gdje cemo spremati unešene znamenke, treba nam još jedno ekstra mjesto za znak za terminaciju "\0"
bool a = true; // varijabla koja označava unošenje broja

 

u liniju 22, tj. u red iza:

char customKey=0;

 

 

Problem je što nemam instaliran arduino IDE, pa nemogu provjeriti ispravnost koda.

7 dana
offline
Re: Arduino - projekti, ideje, savjeti, problemi

prebačeno

 poruka i greška

 

7 godina
offline
Re: Arduino - projekti, ideje, savjeti, problemi

Natjerao si me da instaliram Arduino te probam kod.

Meni sad kompajlira bez greške, a sad dal' ce program raditi onak kak sam zamislio, neznam...

 

// program za pokretanje step motora napred nazad
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <Stepper.h> //including stepper motor library
#include <EEPROM.h>

int button1Pin = A0; // (u ovoj verziji koda koristi se analogni ulaz kao digitalni)
int button2Pin = A1; // (u ovoj verziji koda koristi se analogni ulaz kao digitalni)
int stepIN1Pin = 10;
int stepIN2Pin = 13;
int stepIN3Pin = 12;
int stepIN4Pin = 11;
int stepsPerRevolution = 2060; // amount of steps per revolution

//char password[4];
char dist[4];
int i=0;
char customKey=0;
const byte entryMaxSize = 3; //maksimalan broj znamenki 0-999
static char digits[entryMaxSize + 1]; // array gdje cemo spremati unešene znamenke, treba nam još jedno ekstra mjesto za znak za terminaciju "\0"
bool a = true; // varijabla koja označava unošenje broja

const byte ROWS = 4;
const byte COLS = 4;

char hexaKeys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3, 2};
Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
LiquidCrystal_I2C lcd(0x27, 16, 2);
Stepper myStepper(stepsPerRevolution, stepIN2Pin, stepIN4Pin, stepIN3Pin, stepIN1Pin);
int button1State, button2State;
long int distance;

void setup(){
pinMode(button1Pin, INPUT);
pinMode(button2Pin, INPUT);
myStepper.setSpeed(15);
lcd.backlight();
lcd.init();

//čitanje iz eeproma zadnju spremljenu vrijednost; kad se arduino upali da ostane na zadnjoj podešenoj vrijednosti
for(int i=0;i<entryMaxSize;i++){
digits[i]=EEPROM.read(i);
}
distance = atol(digits); //konverzija unešenih znakova u jednu brojku
//ispisivanje učitanih vrijednosti
lcd.clear();
lcd.print("Dist set:");
lcd.setCursor(0, 1); //lcd u drugi red
for (i = 0; i < entryMaxSize; i++) {
lcd.print(digits[i]);
}
}


void loop(){
static byte x; // index znamnki

char key = customKeypad.getKey();
if (key != NO_KEY) // Check for a valid key.
{
switch (key)//prouči malo switch-case funkcije u C-u... ako imaš vremena i volje učiti
{
case '#': //ako je unešena znamenka "#"
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("enter dist:");
lcd.setCursor(0, 1); //lcd u drugi red
x = 0; // reset the position of array
a = true;
break;

case 'A':
if (a){ // ako je u programibilnom modu
lcd.clear();
lcd.print("Dist set:");
lcd.setCursor(0, 1); //lcd u drugi red
for (i = 0; i < entryMaxSize; i++){
lcd.print(digits[i]);
EEPROM.write(i,digits[i]);
}
a = false; // izlaz iz programibilnog moda
distance = atol(digits); //konverzija unešenih znakova u jednu brojku
}
break;

default:
if (a){ // ako je u programibilnom modu
// add key to userinput array and increment counter
if ( key >= '0' && key <= '9' ){ // key is of type char and has a value between 0 and 9 so do something with it.
digits[x++] = key; //zapisujemo pritisnutu vrijednost na poziciju x, te povecavamo poziciju da bi upisali sljedeću znamenku
digits[x] = '\0';
lcd.print( key ) ; // new print statement <<<<<<<<<<<<<<<<
}
}
break;
}
}

button1State = digitalRead(button1Pin);
button2State = digitalRead(button2Pin);
if (((button1State == LOW) && !(button2State == LOW))) // if we're pushing button 1 OR button 2
myStepper.step(-stepsPerRevolution* distance); // tu još unesi korekcijski faktor (ako je potrebno)
if (((button2State == LOW) && !(button1State == LOW))) // if we're pushing button 1 OR button 2
myStepper.step(-stepsPerRevolution/2);
}

7 dana
offline
Arduino - projekti, ideje, savjeti, problemi

Svaka čast majstore. Kod radi upravo onako kako sam zamislio. E sad još trebam složit mehaniku i sve to skalupit i mislim da će biti super.

 

Hvala na trudu i pomoći

 
0 0 hvala 0
7 godina
offline
Re: Arduino - projekti, ideje, savjeti, problemi

Nema problema. Drago mi je da radi.

 

ajde samo promijeni

bool a = true; // varijabla koja označava unošenje broja

u:

bool a = false; // varijabla koja označava unošenje broja

 

tako da pri pokretanju nije automatski u programibilnom modu, nego tek nakon pritiska na tipku "#"

 

i snimi video kad sve složiš :)

Ova tema je sadržajno povezana sa sljedećim temama: Uvod u elektrotehniku (istosmjerna struja)
Nova poruka
E-mail:
Lozinka:
 
vrh stranice