Picaxe .bas do arduino .ino

rcgino
Příspěvky: 8
Registrován: 14 pro 2014, 23:49

Picaxe .bas do arduino .ino

Příspěvek od rcgino »

Zdravím páni,
mám dotaz či existuje nejaký konvertor z .bas do .ino ? V basicu nemám problém napísať program , ktorý funguje tak ako chcem no pri všetkých pokusoch to neviem prinútiť fungovať v arduine ?! Jedná sa o sledovanie stavu dvoch tlačítok s určitou sekvenciou a čo je hlavné pri zmene stavu tlačítka z HIGH do LOW okamžite zrušiť sekvenciu a pri opätovnom stlačení začať odznova.

Kód: Vybrat vše

Basic: 
Start:
if pinC.4 = 1 and pinC.3 = 0 then gosub defuse_slow
if pinC.4 = 1 and pinC.3 = 1 then gosub defuse_fast
if pinC.4 = 0  then low B.0,B.1,B.2,B.3,B.4,B.5 endif

goto start

defuse_slow:
pause 100
if pinC.4 = 0 then gosub storno
pause 100
if pinC.4 = 1 then high B.0
                   pause 300
			 low B.0
			 pause 900 endif
if pinC.4 = 0 then gosub storno
pause 100
if pinC.4 = 1 then gosub defuse_slow2
return

defuse_slow2:
pause 100
if pinC.4 = 0 then gosub storno
pause 100
if pinC.4 = 1 then high B.1
                   pause 300
			 low B.1
			 pause 900 endif
if pinC.4 = 0 then gosub storno
pause 100
if pinC.4 = 1 then gosub defuse_slow3
return

defuse_slow3:
pause 100
if pinC.4 = 0 then gosub storno
pause 100
if pinC.4 = 1 then high B.2
                   pause 300
			 low B.2
			 pause 900 endif
if pinC.4 = 0 then gosub storno
pause 100
if pinC.4 = 1 then gosub defuse_slow4
return

defuse_slow4:
pause 100
if pinC.4 = 0 then gosub storno
pause 100
if pinC.4 = 1 then high B.2
                   pause 300
			 low B.2
			 pause 900 endif
if pinC.4 = 0 then gosub storno
pause 100
if pinC.4 = 1 then gosub defuse_slow5
return

defuse_slow5:
pause 100
if pinC.4 = 0 then gosub storno
pause 100
if pinC.4 = 1 then high B.3
                   pause 300
			 low B.3
			 pause 900 endif
if pinC.4 = 0 then gosub storno
pause 100
if pinC.4 = 1 then gosub defuse_slow6
return

defuse_slow6:
pause 100
if pinC.4 = 0 then gosub storno
pause 100
if pinC.4 = 1 then high B.4
                   pause 300
			 low B.4
			 pause 900 endif
if pinC.4 = 0 then gosub storno
pause 100
if pinC.4 = 1 then gosub defuse_slow7
return

defuse_slow7:
pause 100
if pinC.4 = 0 then gosub storno
pause 100
if pinC.4 = 1 then high B.5
                   pause 300
			 low B.5
			 pause 2000 endif

return

defuse_fast:
pause 100
if pinC.4 = 0 then gosub storno
pause 100
if pinC.4 = 1 then high B.0
                   pause 200
			 low B.0
			 pause 200 endif
if pinC.4 = 0 then gosub storno
pause 100
if pinC.4 = 1 then gosub defuse_fast2
return

defuse_fast2:
pause 100
if pinC.4 = 0 then gosub storno
pause 100
if pinC.4 = 1 then high B.1
                   pause 200
			 low B.1
			 pause 200 endif
if pinC.4 = 0 then gosub storno
pause 100
if pinC.4 = 1 then gosub defuse_fast3
return

defuse_fast3:
pause 100
if pinC.4 = 0 then gosub storno
pause 100
if pinC.4 = 1 then high B.2
                   pause 200
			 low B.2
			 pause 200 endif
if pinC.4 = 0 then gosub storno
pause 100
if pinC.4 = 1 then gosub defuse_fast4
return

defuse_fast4:
pause 100
if pinC.4 = 0 then gosub storno
pause 100
if pinC.4 = 1 then high B.2
                   pause 200
			 low B.2
			 pause 200 endif
if pinC.4 = 0 then gosub storno
pause 100
if pinC.4 = 1 then gosub defuse_fast5
return

defuse_fast5:
pause 100
if pinC.4 = 0 then gosub storno
pause 100
if pinC.4 = 1 then high B.3
                   pause 200
			 low B.3
			 pause 200 endif
if pinC.4 = 0 then gosub storno
pause 100
if pinC.4 = 1 then gosub defuse_fast6
return

defuse_fast6:
pause 100
if pinC.4 = 0 then gosub storno
pause 100
if pinC.4 = 1 then high B.4
                   pause 200
			 low B.4
			 pause 200 endif
if pinC.4 = 0 then gosub storno
pause 100
if pinC.4 = 1 then gosub defuse_fast7
return

defuse_fast7:
pause 100
if pinC.4 = 0 then gosub storno
pause 100
if pinC.4 = 1 then high B.5
                   pause 300
			 low B.5
			 pause 2000 endif
return

storno:
pause 300
high C.0
low B.0,B.1,B.2,B.3,B.4,B.5
pause 300
low C.0
return
Vladimir66
Příspěvky: 385
Registrován: 02 dub 2014, 15:30

Re: Picaxe .bas do arduino .ino

Příspěvek od Vladimir66 »

priloz jeste ten kod arduina. (pouze hrani s I/O bity - to by nemel byt problem)
-V66
Uživatelský avatar
Dex
Administrátor
Příspěvky: 1519
Registrován: 16 úno 2013, 14:26

Re: Picaxe .bas do arduino .ino

Příspěvek od Dex »

...a kód patří do [code][/code], ať to zase nemusím upravovat ;)
"all your robots are belong to us"
robodoupe.cz
DavidO
Příspěvky: 1133
Registrován: 01 kvě 2013, 21:27

Re: Picaxe .bas do arduino .ino

Příspěvek od DavidO »

Podle mě to je zbytečně komplikované. Navrhuju:
používat ELSE (=>přehlednější)
na postupné tikání B jen nastavit, jestli je rychlé nebo pomalé a pak to jet jedním kódem (=>poloviční program)
všude tam je 100, 300/900 nebo 200/200 dát pojmenované konstanty nebo proměnné (=> čitelnější a udržovatelnější)
na kontrolu zmáčknutí tlačítka na C.4 použít interrupt, pokud možno hardwarový (nevím na kterém Picaxe to má běžet) (=>rychlejší odezva, jednodušší kód)
místo postupného nastavování a shazování jednotlivých konkrétních B.něco držet v proměnné hodnotu, na kterou se nastaví celý port B a v cyklu v ní posouvat jeden bit, asi nějak takhle:

Kód: Vybrat vše

hodnota = 1
for pozice = 0 to 5
	pinsB = hodnota
	hodnota = hodnota * 2
	pause 300
	pinsB = 0
	pause 1000
next
(to je bez ošetření stornotlačítka, ale to když by jeho ošetření bylo interruptem, tak by tohle už bylo všechno)

---
Co se týče Arduina, tak tam to půjde ještě snáz, protože se to nepíše v "něčemjakoBASIC", ale v C++, což je podstatně silnější nástroj (a tahle úloha je velmi jednoduchá i tak). Že to neumíte přinutit, je jen že v tom nejste zběhlý. Jak píše Vláďa, dejte sem ten kód a podíváme se na něj.
Nikoho plánovaně neurážím. Jestli se Vám nelíbí co píšu, tak to nečtěte. A ostatně, třeba za to nemůžu - Researchers believe that dark humor can be a significant symptom of dementia.
pgerla
Příspěvky: 400
Registrován: 11 dub 2013, 00:17

Re: Picaxe .bas do arduino .ino

Příspěvek od pgerla »

Poslat schéma je vhodnější, než kód. Když člověk uvidí jak je to zapojené, snáz odhadne jak poradit, jestli přes INT nebo PINB.
DavidO
Příspěvky: 1133
Registrován: 01 kvě 2013, 21:27

Re: Picaxe .bas do arduino .ino

Příspěvek od DavidO »

Pro rcgina: rozhodně pošlete kód, se kterým chcete poradit (nebo ještě raději oboje, kód i zapojení). Jo a na kterém Arduinu to chcete mít?
Pgerla: pokud máme poradit, proč nějaký kód nefunguje, tak rada, aby místo toho poslal schéma, je poněkud nevhodná.

Ještě zpět k úplně prvnímu dotazu: konvertor z Picaxe .bas do Arduino .ino jako takový velmi pravděpodobně neexistuje. Podle mě ani nemá smysl - i kdyby existoval, vyprodukoval by něco příšerného, protože by do prostředí Arduina přenesl postupy z Picaxe a to by nebylo dobré (nehledě na to, že by to bylo pro jiný kontroler s jinými vlastnostmi, takže zaměnitelnost by i tak nemohla být zcela automatická). Přepsání si myslím je výrazně vhodnější. Pár rad je třeba zde:BASIC to Arduino C: Arduino C programming for Basic Programmers Cheat Sheetl.
Nikoho plánovaně neurážím. Jestli se Vám nelíbí co píšu, tak to nečtěte. A ostatně, třeba za to nemůžu - Researchers believe that dark humor can be a significant symptom of dementia.
rcgino
Příspěvky: 8
Registrován: 14 pro 2014, 23:49

Re: Picaxe .bas do arduino .ino

Příspěvek od rcgino »

Zdravím, no takú odozvu som nečakal. No s programom pre arduino je to trochu zložitejšie. Dokázal som urobiť sekvenciu podľa postupnosti , ale nereaguje mi to na zmenu stavu tlačítka z HIGH na LOW. Schéma zapojenia je jednoduchá dva vstupy (tlačítka) (piny 2 a 3 (arduino Nano)) a 7 výstupov spínajúcich tranzistory a následne relé (piny 6-11) storno (pin12). V podstate sa mi jedná o to nahradiť klávesnicu 3x4 pomocou relé a aby arduino namiesto mňa zadalo kód. Podľa toho či bude pin2 v LOW bude táto sekvencia trvať 10s ak naopak v HIGH bude to trvať 5s. Avšak spúšťanie sekvencie záleží od stavu pin3. Ak bude pin3 HIGH a pin2 LOW pôjde sekvencia 10s no stále musí sledovať stav na pin3 , ktorý ak sa zmení na LOW ukončí sekvenciu a zmení stav na pin12 na HIGH menšia pauza a potom na LOW. Pri každom znovu zopnutí pinu3 na HIGH začať sekvenciu stále od začiatku (num7,num3,num5,num5,num6,num0,num8).

Zatiaľ mám program napísaný len ako sekvenciu, no bez odozvy na zmenu stavu LOW na tlačítku a začiatku sekvencie

Kód: Vybrat vše

int numX = 12;
int num7 = 11;
int num3 = 10;
int num5 = 9;
int num6 = 8;
int num0 = 7;
int num8 = 6;

int pin_switch = 3;
 
// variables to hold the new and old switch states
boolean oldSwitchState = LOW;
boolean newSwitchState1 = LOW;
boolean newSwitchState2 = LOW;
boolean newSwitchState3 = LOW;
boolean newSwitchState4 = LOW;
boolean newSwitchState5 = LOW;
boolean newSwitchState6 = LOW;
boolean newSwitchState7 = LOW;
 
byte state = 0;
 
void setup() 
{
    pinMode(numX, OUTPUT);   digitalWrite(numX, LOW);
    pinMode(num7, OUTPUT);   digitalWrite(num7, LOW); 
    pinMode(num3, OUTPUT);   digitalWrite(num3, LOW); 
    pinMode(num5, OUTPUT);   digitalWrite(num5, LOW);
    pinMode(num6, OUTPUT);   digitalWrite(num6, LOW);
    pinMode(num0, OUTPUT);   digitalWrite(num0, LOW);
    pinMode(num8, OUTPUT);   digitalWrite(num8, LOW);
    
    
    pinMode(pin_switch, INPUT); 
}
 
void loop()
{
 
    newSwitchState1 = digitalRead(pin_switch);
    delay(5);
    newSwitchState2 = digitalRead(pin_switch);
    delay(5);
    newSwitchState3 = digitalRead(pin_switch);
    delay(5);
    newSwitchState4 = digitalRead(pin_switch);
    delay(5);
    newSwitchState5 = digitalRead(pin_switch);
    delay(5);
    newSwitchState6 = digitalRead(pin_switch);
    delay(5);
    newSwitchState7 = digitalRead(pin_switch);
 
    // if all 7 values are the same we can continue
    if (  (newSwitchState1==newSwitchState2) && (newSwitchState1==newSwitchState7) )
    {
 
        if ( newSwitchState1 != oldSwitchState ) 
        {
         
           // has the button switch been closed?
           if ( newSwitchState1 == HIGH )
           {
                // increase the value of state
                state++;
                if (state > 7) { state = 0; }
             
           if ( newSwitchState1 == LOW )
           {
            digitalWrite(numX, HIGH);
            delay(300);
            digitalWrite(numX, LOW);
           { state = 0; }
           }
                
 
                // turn all LEDs off. Doing it this way means we do not need to care about the individual LEDs
                // simply turn them all off and then turn on the correct one. 
                digitalWrite(num7, LOW);
                digitalWrite(num3, LOW);
                digitalWrite(num5, LOW);
                digitalWrite(num6, LOW);
                digitalWrite(num0, LOW);
                digitalWrite(num8, LOW);
 
                // Turn on the next LED
                // Because the value of state does not change while we are testing it we don't need to use else if
                if (state==1) { digitalWrite(num7, HIGH);
                                delay(300);
                                digitalWrite(num7, LOW);
                                delay(800);}
                if (state==2) { digitalWrite(num3, HIGH);
                                delay(300);
                                digitalWrite(num3, LOW);
                                delay(800);}
                if (state==3) { digitalWrite(num5, HIGH);
                                delay(300);
                                digitalWrite(num5, LOW);
                                delay(800);}
                if (state==4) { digitalWrite(num5, HIGH);
                                delay(300);
                                digitalWrite(num5, LOW);
                                delay(800);}
                if (state==5) { digitalWrite(num6, HIGH);
                                delay(300);
                                digitalWrite(num6, LOW);
                                delay(800);} 
                if (state==6) { digitalWrite(num0, HIGH);
                                delay(300);
                                digitalWrite(num0, LOW);
                                delay(800);}
                if (state==7) { digitalWrite(num8, HIGH);
                                delay(300);
                                digitalWrite(num8, LOW);
                                delay(500);}                                                              
 
           }
           
        }  
    }
} 
Vladimir66
Příspěvky: 385
Registrován: 02 dub 2014, 15:30

Re: Picaxe .bas do arduino .ino

Příspěvek od Vladimir66 »

nedari se mi to uplne pochopit/prokouknout.

- mas bezzakmitove tlacitko na (pin_switch) ?
zacatek loopu " // if all 7 values are the same we can continue "
ALE na zacatku ctes 7x (pin_switch) ale vyhodnocujes shodu pouze mezi newSwitchState1,newSwitchState2,newSwitchState7
v tech pauzach 5/10/15ms by ti mohlo tlacitko kmitnout a treba newSwitchState4 by byl jiny nez ostatni.

- zkusil bych si to odladit vypisem na serial monitor. zobrazeni stavu tlacitka a vypis promennych v kontrolnich bodech.
treba zjistis, ze program nebezi tam, kde myslis.

dale
namisto if ( newSwitchState1 != oldSwitchState ) muzes napsat if ( newSwitchState1 == HIGH )
protoze oldSwitchState nikde nemenis...
DavidO
Příspěvky: 1133
Registrován: 01 kvě 2013, 21:27

Re: Picaxe .bas do arduino .ino

Příspěvek od DavidO »

Jak tak na to koukám, tlačítko je asi zapojené proti plusu. Jak je na něm zajištěná úroveň, když není zmáčknuté? (obvykle to je jednodušší naopak, tlačítko spíná na zem a zároveň mu v setup nastavit INPUT_PULLUP místo INPUT a není potřeba nic dalšího (spec. ten odpor nahoru/dolů).
Ten kód je teda varchrlatej, ale na první pokus s Arduinem to neni tak zlý ;-) Debouncing je blbě a storno taky žádná sláva, starý stav se nenastavuje, postupné problikávání jen když je tlačítko high ... tam je víc problémů. Idea se stavem a jeho vynulováním při stornu je OK, Sekvenci ifů bych nahradil jedním switch, ale když se stav použije rafinovaně, tak ani nebude potřeba a půjde to tam dát přímo. A když se to zapojí šikovně (všechno na jeden port), tak nebude potřeba digitalWrite na jednotlivé piny a rovnou se nastaví celý port (a tedy se nemusí ani vypínat předchozí).
A teď kruciální otázka - chcete se s tím sám popasovat a něco se naučit (a zkousnete naše komentáře), anebo nechcete a radši byste dostal hotový kód, kterému ale asi nebudete na první pohled moc rozumět?
Nikoho plánovaně neurážím. Jestli se Vám nelíbí co píšu, tak to nečtěte. A ostatně, třeba za to nemůžu - Researchers believe that dark humor can be a significant symptom of dementia.
rcgino
Příspěvky: 8
Registrován: 14 pro 2014, 23:49

Re: Picaxe .bas do arduino .ino

Příspěvek od rcgino »

Momentálny výpis programu nieje smerodajný , bol to jeden z testov , avšak nie konečný. Tento výpis mám v PC doma no ostatné "testy" v práci.
Mám záujem sa aj učiť , no ak by som videl kompletný výpis programu tiež by mi to pomohlo. Prečo je lepšie sledovať zmenu stavu oproti nule a nie oproti +5V ? Zatiaľ mi celé zariadenie a idea funguje cez PICAXE no v budúcnosti by asi bolo lepšie ten defuse kit prekopať na arduino(nepoznám nikoho v okolí kto ešte používa PICAXE, okrem mňa ).
Odpovědět