Mini CNC osa Z

Odpovědět
Hanz
Příspěvky: 101
Registrován: 25 dub 2019, 23:52
Reputation: 0

Re: Mini CNC osa Z

Příspěvek od Hanz » 02 črc 2019, 20:33

Jó a otázek mám fakt hodně, snažím se je nejdříve vyřešit sám, ale někdy to prostě bez nakopnutí a nápovědy nejde. Hanz

kiRRow
Příspěvky: 179
Registrován: 07 kvě 2019, 07:03
Reputation: 2
Bydliště: Opava

Re: Mini CNC osa Z

Příspěvek od kiRRow » 03 črc 2019, 09:34

Pokud chceš zobrazit skutečnou polohu serva, budeš muset nějak tuto polohu snímat ... pokud ti stačí jen krajní polohy, tak třeba koncovými spínači.

To co stváříš ty, zobrazuje v podstatě jen "polohu programu" ... arduino prostě nastaví na motor nějaký napětí a rozsvítí LEDku ... a to i přes to, že motor se zaseknul, nebo ho někdo ukradnul.

Hanz
Příspěvky: 101
Registrován: 25 dub 2019, 23:52
Reputation: 0

Re: Mini CNC osa Z

Příspěvek od Hanz » 04 črc 2019, 15:57

ano, ano, když jsem servo "ukradnul", tak Arduino si hrálo pořád stejnou písničku dokola a rozsvěcely a zhasínaly se ledky.
Pánové a teď otázka, můžete mi prosím popsat jak je možné, že mi servo zastavuje okamžitě ? co jsem kde splácal ? nedalo mi spát a díval se na videa co mám v tabletu a všimnul si, že při sketchi, kde mám 2 tlačítka, tak to druhé nefunguje , ale zato první zastavuje a spouští servo hned v jakékoliv poloze ?! čím to je ? Když jsem změnil v programu HIGH za LOW v "buttonStatus", tak servo v prvním případě stálo a začalo se otáčet po stlačení tlačítka a opačně. Natočil jsem video, tam je to vidět. odkaz :
https://www.youtube.com/watch?v=skHr48slQms
tady je zdroják:
Servo Stop tlačítkem v pozici - test

Kód: Vybrat vše

#include <Servo.h> //zahrnutí knihovny pro ovládání servo motoru
Servo myservo; //každý motor má svou instanci třídy Servo
int pos = 0; //proměnná obsahující pozici motoru (úhel natočení)

unsigned long currentMillis, lastPosMillis;
int smer; // +1 dopředu, -1 dozadu
int buttonPin1 = 2; // tlačítko na pin 2
int led1 = 11;
int led2 = 10;
int buttonStatus1 = 0;


void setup() {
 
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(buttonPin1, INPUT);
myservo.attach(9); //servo je připojeno na pin  
pos = 0;
smer = 1;
currentMillis=millis();
lastPosMillis=currentMillis;

digitalWrite(led1, pos<5);
digitalWrite(led2, pos>175);
myservo.write(pos);
}

void loop() {
currentMillis=millis(); 
//  tady můžu řešit třeba čtení tlačítek, nebo další zajímavé věci, co se dějí průběžně 
buttonStatus1 = digitalRead(buttonPin1);

if (buttonStatus1 == HIGH)
{ 
myservo.write(pos);

if (currentMillis - lastPosMillis >= 15 ) {
   lastPosMillis=currentMillis;
   pos += smer; // další krok serva správným směrem
if (pos <1 ) {
   smer = 1;
   pos=0;  // pro jistotu, ale ono to není nutné, pokud s pos nehýbu i jinde
   };
if (pos > 179 ) {
   smer = -1;
   pos=180;  // pro jistotu, ale ono to není nutné, pokud s pos nehýbu i jinde
   };
digitalWrite(led1, pos<5);
digitalWrite(led2, pos>175);
myservo.write(pos);
}


if (buttonStatus1 == LOW)
{ 
myservo.write(pos);

if (currentMillis - lastPosMillis >= 15 ) {
   lastPosMillis=currentMillis;
   pos += smer; // další krok serva správným směrem
if (pos <1 ) {
   smer = 1;
   pos=0;  // pro jistotu, ale ono to není nutné, pokud s pos nehýbu i jinde
   };
if (pos > 179 ) {
   smer = -1;
   pos=180;  // pro jistotu, ale ono to není nutné, pokud s pos nehýbu i jinde
   }
digitalWrite(led1, pos<5);
digitalWrite(led2, pos>175);
myservo.write(pos);
     }
    }  
   }
  }
Vypustil jsem druhé tlačítko zbylo viz výše.
A na to snímání pozice serva, hledám a nacházím materiály k prostudování. Na Ose Z u CNC jsem to řešil po nápovědě pomocným kontaktem viz.příspěvek dříve.

Hanz
Příspěvky: 101
Registrován: 25 dub 2019, 23:52
Reputation: 0

Re: Mini CNC osa Z

Příspěvek od Hanz » 04 črc 2019, 17:25

koumám, testuju, tak jsem to ještě očesal

Kód: Vybrat vše

[code]
#include <Servo.h> //zahrnutí knihovny pro ovládání servo motoru
Servo myservo; //každý motor má svou instanci třídy Servo
int pos = 0; //proměnná obsahující pozici motoru (úhel natočení)

unsigned long currentMillis, lastPosMillis;
int smer; // +1 dopředu, -1 dozadu
int buttonPin = 2; // tlačítko na pin 2
int led1 = 11;
int led2 = 10;
int buttonStatus = 0;


void setup() {
 
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(buttonPin, INPUT);
myservo.attach(9); //servo je připojeno na pin  
pos = 0;
smer = 1;
currentMillis=millis();
lastPosMillis=currentMillis;

digitalWrite(led1, pos<5);
digitalWrite(led2, pos>175);
myservo.write(pos);
}

void loop() {
currentMillis=millis(); 
//  tady můžu řešit třeba čtení tlačítek, nebo další zajímavé věci, co se dějí průběžně 
buttonStatus = digitalRead(buttonPin);

if (buttonStatus == LOW)
{ 
myservo.write(pos);

if (currentMillis - lastPosMillis >= 15 ) {
   lastPosMillis=currentMillis;
   pos += smer; // další krok serva správným směrem
if (pos <1 ) {
   smer = 1;
   pos=0;  // pro jistotu, ale ono to není nutné, pokud s pos nehýbu i jinde
   };
if (pos > 179 ) {
   smer = -1;
   pos=180;  // pro jistotu, ale ono to není nutné, pokud s pos nehýbu i jinde
   };
digitalWrite(led1, pos<5);
digitalWrite(led2, pos>175);
myservo.write(pos);
  }
 }
}

[/code]

kiRRow
Příspěvky: 179
Registrován: 07 kvě 2019, 07:03
Reputation: 2
Bydliště: Opava

Re: Mini CNC osa Z

Příspěvek od kiRRow » 06 črc 2019, 20:08

Není dobře splácáno to ošetření zákmitu tlačítka.

Má to fungovat tak, že zkontroluješ jestli se stav tlačítka změnil, pokud ano, tak zkontroluješ jestli tahle změna trvá déle než tzv. debounce time (čas který čekáš na uklidnění tlačítka). Pokud se změnil stav tlačítka, a trvá tohle déle než debounceTime, tak prohlásíš stav tlačítka za platný.

Takže v setupu si uložím poslední stav tlačítka a čas, kdy jsem toto udělal. Také si vytvořím proměnou pro uchování platného stavu tlačítka.
V loopu si na začátku vždy porovnám starý stav s aktuálním stavem, a pokud zjistím rozdíl, uložím si čas tohoto rozdílu.
Potom zkontroluji jestli čas poslední změny stavu - aktuální čas je větší než debounceTime, pokud ano uložím do proměné pro uchování platného stavu tlačítka to, co je právě aktuální stav tlačítka.
Potom kontroluji proměnou, kde si uchovávám platný stav tlačítka. Tam teprve zapisuji to co se má dít po stisku.

Mělo by se to chovat následovně ... tlačítko stisknuto není a je na něm 0 ... stiskneš tlačítko a to začne překmitávat a oběví se na něm na chvilku 1, je zjištěn nový stav a je uložen, zároveň se uloží i čas .... dojde na kontrolu času, ale ten zdaleka ještě nedosálh debounceTime, takže se neděje nic ... čudlík překmitne na 0 ... je zjištěn nový stav, který je uložen, ale zároveň se přepíše i čas ... tím pádem čas nedosáhl debounceTime a nic se neděje ... zase naskočí 1, zapíše se, přepíše se čas .... čas je menší než debounceTime, nic se neděje ... ale tentokrát tlačítko je už uklidněno, 1na něm zůstává, nedochází k přepisu času a ten přesahuje debounceTime ... je vyhodnoceno stisknuto tlačítko a do proměné se zapíše jeho hodnota ....... stejně se to děje když to tlačítko pustíš.

Dále je tam naplácáno že na začátku se pozice nastaví na 0 .... pokud je pozice < 1 tak pos=0; ..... takže pozice nikdy nedosáhne hodnoty větší než 0

EDIT : Omlouvám se jestli ti příjdu zlý, cinický, sarkastický hnidopich, takový už prostě jsem ... nenapíšu ti ani řádku z toho kódu, ale pokud budeš trpět dost dlouho, tak ho nakonec napíšeš celý sám.

kiRRow
Příspěvky: 179
Registrován: 07 kvě 2019, 07:03
Reputation: 2
Bydliště: Opava

Re: Mini CNC osa Z

Příspěvek od kiRRow » 06 črc 2019, 20:40

Teď jsem i kliknul na to video ... hele, dej k těm LED diodám předřadný odpor ... 100-330Ohmů (pro testy je jedno jaký ... klidně tam foukni 1K jen to bude svítit slabě , pro finální výrobek se odpor určí dle barvy a typu) ... trpí nejen diody, ale i výstupy toho arduina.

Hanz
Příspěvky: 101
Registrován: 25 dub 2019, 23:52
Reputation: 0

Re: Mini CNC osa Z

Příspěvek od Hanz » 09 črc 2019, 15:48

Ošetření zákmitů debouncing se učím, no snadnější by pro mě bylo přidat RC + integráč, ale nevzdávám to ! Co se týče předřazeného odporu, tak odpor tam je přiletovány přímo k nožičce, vlastně led na něm stojí / na videu není vidět , na ostatních videích možná ano /, hodnota 330 Ohmů. Mám to tak proto, že s led diodami pořád něco zkouším a testuju.
Zajímavé je, že tak jsem vlastně chtěl, aby to fungovalo ! Dost mě to překvapilo, proto ten dotaz co jsem provedl, že to tak chodí ?

kiRRow
Příspěvky: 179
Registrován: 07 kvě 2019, 07:03
Reputation: 2
Bydliště: Opava

Re: Mini CNC osa Z

Příspěvek od kiRRow » 09 črc 2019, 16:35

U více tlačítek bych taky spíš použil hardwarové ošetření. Šetří to paměť.

Ohledně toho kódu se omlouvám, přehlédnul jsem jeden řádek a to pos += smer;

Pokud chceš aby servo po stisku tlačítka zůstalo stát tam kde momentálně je, tak si musíš vytvořit proměnou ... stačí 1bit ... a v té proměné musíš uchovat to jestli motor má běžet, nebo nemá běžet ... pokud na ošetřeném tlačítku zjistíš stisk, tak jednoduše neguješ onu proměnou ... pokud byla 0, tak se stane 1, pokud byla 1, tak se stane 0 ... tuto proměnou, pak budeš kontrolovat vždy, když budeš chtít změnit pozici motoru ... pokud je proměnná 0, tak servem točit nebudeš ...

Hanz
Příspěvky: 101
Registrován: 25 dub 2019, 23:52
Reputation: 0

Re: Mini CNC osa Z

Příspěvek od Hanz » 16 črc 2019, 21:00

zdravím všechny, jelikož mi přišlo další Arduino Uno, chtěl jsem ho vyzkoušet na něčem, co se učím. Padla volba na tlačítko. A jak jsem řek , jelikož se učím i ošetření tlačítka proti zákmitům, nejrychlejší bylo pro mě sestavení s IO 40106 podle tohoto schématu : https://arduino8.webnode.cz/news/lekce- ... -tlacitka/
Tlačítko a led byly 100% ! Tady je opět video : https://www.youtube.com/watch?v=qgESOuhlLzg
No a nyní zbývá se doučit debounce programovat. Držte mi palce.
A co se týká serva a jeho zastavování v poloze, našel jsem tohle,zapojení se 2 tlačítky, otáčí se jen od 0 do 180 při stisknutí 1tlačítka a od 180 do 0 při stisknutí 2 tlačítka, jinak se zastaví v poloze. odkaz :https://mechatrofice.com/arduino/servo- ... on-control. Sketch je velice krátký, což mě udivuje a zároveň fascinuje! Tohle bych rád uměl .

kiRRow
Příspěvky: 179
Registrován: 07 kvě 2019, 07:03
Reputation: 2
Bydliště: Opava

Re: Mini CNC osa Z

Příspěvek od kiRRow » 17 črc 2019, 16:02

Sketch ti okomentuji, abys věděl co přesně se v něm děje.

Kód: Vybrat vše

#include<Servo.h>  // vložení knihovny pro ovládání serva
int pos = 0; // vytvoření proměné pro uložení pozice serva
Servo servo; // vytvoření proměné servo dle třídy Servo

void setup() { // klasika setup - provede se jen jednou před spuštením loop
  pinMode(2, INPUT); // PIN2 Nastaven jako vstup
  pinMode(3, INPUT); //PIN3 Nastaven jako vstup
  servo.attach(9);// knihovně pro ovládání serva říkáme, že ho má řídit na PINu 9
} // konec setup

void loop() {// klasika loop

  while (digitalRead(2) == HIGH && pos < 180) { // Zatím co na pin2 je přivedeno 5V a zároveň pozice motoru je menší než 180
    pos++; // zvyš pozici serva
    servo.write(pos); // a následně zapiš na servo
    delay(15); // počkej 15ms
  }// konec while 

  while (digitalRead(3) == HIGH && pos > 0) { // Zatím co na pin3 je přivedeno 5V a zároveň pozice motoru je větší než 0
    pos--; // sniž pozici serva
    servo.write(pos); // a následně zapiš na servo
    delay(15); // počkej 15ms
  }// konec while
  
}// konec loop

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 0 hostů