Stránka 1 z 2
Jeden void pro více různých periferií
Napsal: 24 lis 2019, 01:42
od Bart_
Ahoj, mám takovýto kód:
Kód: Vybrat vše
void kalibracePump () { //kalibrace pumpy
int kalibrace = 15000; //15000 kroků pro kalibraci
float nadavkovano; //musí se zadat -> hodnota která se nadávkovala při 15000 krocích
int zkalibrovano; //vypočtená kalibrace, se kterou se počítá při dávkování
motor.step(kalibrace);
//čekej na zadání parametrů
zkalibrovano = (kalibrace5mL * kalibrace) / nadavkovano;
Serial.println(zkalibrovano);
//uložit kalibraci do EEPROM
}
void testKalibrace() {
motor.step(zkalibrovano);
}
a mám více krokových motorů, které bych chtěl takto kalibrovat...Jde to udělat tak, abych nemusel pro každý motor psát tento kód zvlášť (void kalibracePump1, void kalibracePump2,..)?
Něco jako (ten loop je jen jako příklad, ani nevim jestli by to fungovalo

):
Kód: Vybrat vše
void kalibracePump (String a) { //kalibrace pumpy
int kalibrace = 15000; //15000 kroků pro kalibraci
float nadavkovano; //musí se zadat -> hodnota která se nadávkovala při 15000 krocích
int zkalibrovano; //vypočtená kalibrace, se kterou se počítá při dávkování
a.step(kalibrace);
//čekej na zadání parametrů
zkalibrovano = (kalibrace5mL * kalibrace) / nadavkovano;
Serial.println(zkalibrovano);
//uložit kalibraci do EEPROM
}
void testKalibrace(String a) {
a.step(zkalibrovano);
}
void loop(){
if(digitalRead(2) ==HIGH){ //pokud bylo zmáčknuto tlačítko na pinu 2, kalibruj motor 1
kalibracePump(motor1);
}
Prostě pokud mám opakovat nějakou funkci pro různé periferie, nechci ji psát několikrát.
Dík za rady
Re: Jeden void pro více různých periferií
Napsal: 24 lis 2019, 07:09
od gilhad
Ano, akorat skoro jiste nebudes chtit ten motor predavat jako retezec (protoze v tom puvodnim to retezec neni a nevolas to jako
"motor1".step() ), ale jako spravny typ
Pokud mas nekde deklaraci typu
Kód: Vybrat vše
UzasnyMotor motor1;
UzasnyMotor motor2;
tak budes mit hlavicku
Kód: Vybrat vše
void testKalibrace(UzasnyMotor a) {
a.step(zkalibrovano);
}
a pak ti to bude fungovat tak, jak chces (a nejspis budes mit i ruznou kalibraci pro ruzne motory, takze to zkalibrovano taky predas jako parametr)
Re: Jeden void pro více různých periferií
Napsal: 24 lis 2019, 08:57
od kiRRow
Ten motor to je objekt tvořený nějakou knihovnou dle třídy ? Jestli by nebylo rozumnější trošku poeditovat onu třídu a rozšířit ji o metodu zkalibrujSe() - pokud už tam něco takového dokonce není. Pak už budeš jen volat např : motor1.zkalibrujSe(); motor2.zkalibrujSe();
Re: Jeden void pro více různých periferií
Napsal: 24 lis 2019, 09:49
od Bart_
gilhad: Jasně, takže když to jsou krokové motory, u kterých používám knihovnu stepper.h tak použiji toto?:
Kód: Vybrat vše
Stepper motor1(stepsPerRevolution, 8, 9, 10, 11);
Stepper motor2(stepsPerRevolution, 4, 5, 6, 7);
void loop(){
if(digitalRead(2) ==HIGH){ //pokud bylo zmáčknuto tlačítko na pinu 2, kalibruj motor 1
testKalibrace(motor1);
}
void testKalibrace(Stepper a) {
a.step(zkalibrovano);
}
kiRRow: Tvůj nápad se mi líbí víc, ale nikdy jsem to nedělal. Jak jsem psal výše, používám knihovnu stepper.h a umím programovat pouze ve wiringu. Knihovnu jsem nikdy nepsal ani neupravoval. Dokonce se mi nedaří najít ani defaultní knihovny
Krokové motory používám jako peristaltická čerpadla s 3d tiskovou hlavou.
Re: Jeden void pro více různých periferií
Napsal: 24 lis 2019, 12:01
od gilhad
Ano, presne tak
ad kiRRow - resi jiny problem, nez jsem resil ja, ve vysledku pouzijes stejne oboji
Stepper.h je nekde na tvem disku a da se vyhledat. hned vedle nej bude neco Stepper.cpp, kde je ten kod.
Ale to je celkem jedno, muzes si udelat vlastni tridu nad touto a jen tam dopsat, co potrebujes noveho/jineho a pouzivat pak tuhle tridu
Kód: Vybrat vše
class MujMotor: public Stepper {
public:
int kalibrace;
void zkalibrujSe(){
kalibrace=42; // zakladni odpoved ...
}
// .....
}
MujMotor motor1(stepsPerRevolution, 8, 9, 10, 11);
void setup(){
....
motor1.zkalibrujSe();
Serial.print(motor1.kalibrace); // napise 42
...
}
Re: Jeden void pro více různých periferií
Napsal: 24 lis 2019, 12:06
od kiRRow
Perilstatickou pumpu jsem stavěl dle :
https://www.thingiverse.com/thing:2619479 - alespoň první zkušební kousek, pro potřeby provozu byl firmware upraven a změnilo se i zapojení pár pinů. Taky došlo k oddělení LCD displaye a rotačního enkodéru a zbytku do dvou samostatných krabiček, propojených kabelem. Ale jinak 7 jich už spokojeně sedí pod strojem a dávkuje vodu
Objekty a třídy hold do c++ patří. Koukal jsem teď na knihovnu Stepper a není to nic moc složitého, žádná kalibrace tam není. Co přesně má dělat ten motor při kalibraci ?
no a gilhadovo řešení je nejluxusnější ... tomu se nadává dědičnost ... pár řádku kódů ti vytvoří třídu která zdědí veškeré vlastnosti od třídy od které je odvozena ... a jen do ní doplníš co potřebuješ
Re: Jeden void pro více různých periferií
Napsal: 24 lis 2019, 12:13
od kiRRow
Jinak tříd se vůbec nebát ... vem si to tak, že když si jednou napíšeš třídu pro ošetření zákmitu tlačítka, pak ji umístíš do vlastních souborů *.h a *.cpp, tak máš v podstatě knihovnu ...
v příštím projektu budeš obsluhovat 5 tlačítek, naimportuješ si knihovnu co jsis vytvořil a už jen vytváříš objekty se kterými pracuješ, žádné kopírování kódů a zdvojování, ztrojování ..... debounce1, debounce2, debounce3 .... pak je z toho nepřehlednej humáč
Re: Jeden void pro více různých periferií
Napsal: 24 lis 2019, 15:38
od Bart_
Předpokládám že každé vytisknuté čerpadlo bude dávat na stejný počet kroků trochu jiné hodnoty. Takže v aplikaci stisknu kalibrovat, a pumpa udělá 15000 kroků, to nadávkuje určité množství ml. To vyplním do aplikace a trojčlenkou si vypočítám kolik kroků je potřeba na dávkování 5ml. No a pak když bude potřeba dávkovat třeba 30 ml, tak další trojčlenkou vypočítá kolik kroků musí udělat aby to nadávkoval.
Já zatím používám tuhle
https://www.thingiverse.com/thing:1134817, ale líp mi vychází tisknutí SLA tiskem než klasicky (nedrhne). Zatím je to proof of concept.
Dobře, jdu si číst něco o třídách

Re: Jeden void pro více různých periferií
Napsal: 24 lis 2019, 16:07
od kiRRow
Ano kalibrace se provádí nadávkováním X množství přesně danou rychlostí a přesně daným časem ... zvážený výsledek se zadá do nastavení a uloží do EEPROM. Ale má i režim, který využívá počtu otáček a kalibrace vůbec není nutná.
Re: Jeden void pro více různých periferií
Napsal: 24 lis 2019, 22:44
od Bart_
Takže..dostal jsem se k tomuto:
Kód: Vybrat vše
#include <Stepper.h>
class MujMotor: public Stepper {
public:
MujMotor(int, int, int, int, int);
int zkalibrovano;
int kalibrace10mL = 10;
String readString;
void kalibracePump();
void odvzdusneniPump();
void testKalibrace();
void rucniMichani();
};
void MujMotor::kalibracePump () { //kalibrace pumpy a= krokový motor
long kalibrace = 10000; //10000 kroků pro kalibraci
float nadavkovano; //musí se zadat -> hodnota která se nadávkovala při 15000 krocích
step(kalibrace);
Serial.println("zadejte nadávkované množství v ml");
//čekej na zadání parametrů
while (!Serial.available()); //čekej na zadání parametrů
while (Serial.available()) {
char c = Serial.read(); //gets one byte from serial buffer
readString += c; //makes the String readString
delay(2); //slow looping to allow buffer to fill with next character
}
if (readString.length() > 0) {
//Serial.println(readString); //so you can see the captured String
nadavkovano = readString.toFloat(); //convert readString into a number
readString = "";
}
zkalibrovano = (kalibrace10mL * kalibrace) / nadavkovano;
Serial.println(zkalibrovano);
//return zkalibrovano;
// uložit kalibraci do EEPROM
}
void MujMotor::testKalibrace() {
Serial.println("dávkuji 10ml");
step(zkalibrovano);
}
const int stepsPerRevolution = 200;
MujMotor motor1(stepsPerRevolution, 8, 9, 10, 11); //zde mi to nedovolí vytvořit tento objekt
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
motor1.kalibracePump();
}
void loop() {
// put your main code here, to run repeatedly:
}
Nedaří se mi vytvořit objekt motor1, píše mi to tuto chybu:
C:\Users\bartv\AppData\Local\Temp\ccwIAt3T.ltrans0.ltrans.o: In function `__static_initialization_and_destruction_0':
C:\Users\bartv\AppData\Local\Temp\arduino_modified_sketch_741779/sketch_nov24c.ino:56: undefined reference to `MujMotor::MujMotor(int, int, int, int, int)'
collect2.exe: error: ld returned 1 exit status
exit status 1
Nastala chyba při kompilaci u desky Arduino/Genuino Uno.
Definovat MujMotor::MujMotor(int, int, int, int, int) se mi taky ale nedaří, kde dělám chybu? Snažím se o něco takovýho:
Kód: Vybrat vše
MujMotor::MujMotor(int number_of_steps, int motor_pin_1, int motor_pin_2, int motor_pin_3, int motor_pin_4) : Stepper (int number_of_steps, int motor_pin_1, int motor_pin_2, int motor_pin_3, int motor_pin_4) {
}
odkaz na knihnu Stepper:
https://github.com/arduino-libraries/St ... master/src