Podvozek Merkur a Arduino Uno

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Odpovědět
domorodecz
Příspěvky: 2
Registrován: 22 říj 2020, 07:43
Reputation: 0

Podvozek Merkur a Arduino Uno

Příspěvek od domorodecz » 22 říj 2020, 08:16

Dobrý den,
chtěl bych touto cestou poprosit o radu. Mám ze stavebnice Merkur kolový podvozek + vysílačka Merkur + ovládané Arduinem Uno. Podvozek ovládám níže vloženým programem. Po dobu, kdy držím tlačítko, například vpřed, podvozek jede vpřed, když tlačítko pustím zastaví. Jedná se mi o to, když například stisknu tlačítko dozadu, aby se současně prováděla funkce blikání a po doby držení tlačítka podvozek současně blikal blinkry a jel dozadu (dioda na pinu 7). Zároveň bych se chtěl zeptat, jak by šlo udělat, stisknutím tlačítka rozsvítit led diodu, druhým stiskem stejného tlačítka vypnout (např Led na pinu4). Jsem v tomto případě skoro začátečník a nevím jak na to. Předem děkuji za jakoukoliv radu.


#define L1 8 // Levý motor
#define L2 9 // Levý motor
#define R1 10 // Pravý motor
#define R2 11 // Pravý motor

#define E1 3 // Levý Motor on/off
#define E2 5 // Pravý motor on/off

int SR = 250; // Rychlost pravého motoru
int SL = 250; // Rychlost levého motoru

int Blikani = 5; // Počet zablikání pro tlačítko Světla3

void setup()
{
pinMode(E1, OUTPUT);
pinMode(E2, OUTPUT);

pinMode(A5, INPUT);
pinMode(A4, INPUT);
pinMode(A3, INPUT);
pinMode(A2, INPUT);

pinMode(4, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(12, OUTPUT);

pinMode(L1, OUTPUT);
pinMode(L2, OUTPUT);
pinMode(R1, OUTPUT);
pinMode(R2, OUTPUT);

analogWrite(E1, SL);
analogWrite(E2, SR);
}

void loop()
{

// ----------------------------------------Tlacitka - motory ---------------------------------------------------------

// Dopredu
if ((digitalRead(A5) == LOW) && (digitalRead(A4) == HIGH) && (digitalRead(A3) == HIGH) && (digitalRead(A2) == HIGH))
{
analogWrite(L1, 255);
analogWrite(L2, 0);
analogWrite(R1, 0);
analogWrite(R2, 255);
delay(100);
analogWrite(L1, 0);
analogWrite(L2, 0);
analogWrite(R1, 0);
analogWrite(R2, 0);
}

// Vpravo
if ((digitalRead(A5) == HIGH) && (digitalRead(A4) == LOW) && (digitalRead(A3) == HIGH) && (digitalRead(A2) == HIGH))
{
analogWrite(L1, 0);
analogWrite(L2, 255);
analogWrite(R1, 255);
analogWrite(R2, 0);
delay(100);
analogWrite(L1, 0);
analogWrite(L2, 0);
analogWrite(R1, 0);
analogWrite(R2, 0);
}

// Vlevo
if ((digitalRead(A5) == HIGH) && (digitalRead(A4) == HIGH) && (digitalRead(A3) == HIGH) && (digitalRead(A2) == LOW))
{
analogWrite(L1, 255);
analogWrite(L2, 0);
analogWrite(R1, 255);
analogWrite(R2, 0);
delay(100);
analogWrite(L1, 0);
analogWrite(L2, 0);
analogWrite(R1, 0);
analogWrite(R2, 0);
}

// Dozadu
if ((digitalRead(A5) == HIGH) && (digitalRead(A4) == HIGH) && (digitalRead(A3) == LOW) && (digitalRead(A2) == HIGH))
{
analogWrite(L1, 0);
analogWrite(L2, 255);
analogWrite(R1, 0);
analogWrite(R2, 255);
delay(100);
analogWrite(L1, 0);
analogWrite(L2, 0);
analogWrite(R1, 0);
analogWrite(R2, 0);
}

// ----------------------------------------Tlacitka - svetla --------------------------------------------------------

// Svetla 1 - Zapnout 1 bile a 1 cervene svetlo
if ((digitalRead(A5) == HIGH) && (digitalRead(A4) == LOW) && (digitalRead(A3) == LOW) && (digitalRead(A2) == HIGH))

{
digitalWrite(4, HIGH);
}

// Svetla 2 - Zapnout 2 bile a 2 cervene svetla
if ((digitalRead(A5) == HIGH) && (digitalRead(A4) == HIGH) && (digitalRead(A3) == LOW) && (digitalRead(A2) == LOW))
{
digitalWrite(6, HIGH);
digitalWrite(4, HIGH);
}

// Svetla 3 - Oranzove svetla - blikani
if ((digitalRead(A5) == HIGH) && (digitalRead(A4) == LOW) && (digitalRead(A3) == HIGH) && (digitalRead(A2) == LOW))
{
for(int x=0; x<Blikani; x++)
{
digitalWrite(7, HIGH);
delay(500);
digitalWrite(7, LOW);
delay(500);
}
}

// Svetla 4 - Vypnout svetla
if ((digitalRead(A5) == LOW) && (digitalRead(A4) == LOW) && (digitalRead(A3) == HIGH) && (digitalRead(A2) == HIGH))
{
digitalWrite(4, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
}

// *****************************
else
{
}
}

Uživatelský avatar
kiRRow
Příspěvky: 1152
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Podvozek Merkur a Arduino Uno

Příspěvek od kiRRow » 22 říj 2020, 16:10

Rozhodně zapomeň na použití funkce delay. Zkus si to rozblikat takhle : https://bastlirna.hwkitchen.cz/arduino- ... kce-delay/

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Podvozek Merkur a Arduino Uno

Příspěvek od pavel1tu » 22 říj 2020, 20:34

Tohle máme na kroužku jako příklad (výplod dětí)
blikání od tlačítka bez dalay.
Třeba tě to navede

Kód: Vybrat vše

// Blikaní bez Delay od stavu  

// konstanty 
#define ledPin 13                  // číslo pinu LED
#define tlacitko 7                 // cislo pinu tlacitka
unsigned long  interval = 300;     //interval, ve kterém bude LED blikat (milisekundy)

// Proměnné 
int ledState = LOW;                // ledState použité k nastavení LED
unsigned long previousMillis = 0;  // bude ukládat poslední případ aktualizace LED
unsigned long currentMillis;

void setup() {
    // nastavte digitální piny
    pinMode(ledPin, OUTPUT);
    pinMode(tlacitko, INPUT_PULLUP);
}

void loop(){
    
    if (digitalRead(tlacitko) == LOW) // dokud je stlaceno tlacitko blikej
    {
    // vlastní blikani
    currentMillis = millis();
    if(currentMillis - previousMillis > interval) {
        previousMillis = currentMillis;
        if (ledState == LOW) ledState = HIGH;
        else ledState = LOW;
       
        digitalWrite(ledPin, ledState);
        } // vlastní blikani konec
    }
    else digitalWrite(ledPin, LOW); //pokud neni tlacitko LED vypni



    

}

UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

domorodecz
Příspěvky: 2
Registrován: 22 říj 2020, 07:43
Reputation: 0

Re: Podvozek Merkur a Arduino Uno

Příspěvek od domorodecz » 22 říj 2020, 21:02

Dobrý večer, děkuji moc všem za zaslané příspěvky. Vyřešeno, sice asi tak trochu na prasáka, ale účel to plní.
- nakonec to chtělo vypnutí led, jinak zůstávala po uvolnění tlačítka zapnutá
- musel jsem dát ještě jedno časování pro vypnutí led nakonec dioda jinak jen slabě problikla

Finální program vypadá teď takto...

#define L1 8
#define L2 9
#define R1 10
#define R2 11

#define E1 3
#define E2 5

const int ledPin = 7;
int ledState = LOW;
unsigned long previousMillis = 0;
unsigned long interval = 500;
unsigned long currentMillis;

int SR = 250;
int SL = 250;

int Blikani = 5;

void setup()
{
pinMode(E1, OUTPUT);
pinMode(E2, OUTPUT);

pinMode(A5, INPUT);
pinMode(A4, INPUT);
pinMode(A3, INPUT);
pinMode(A2, INPUT);

pinMode(4, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(12, OUTPUT);

pinMode(L1, OUTPUT);
pinMode(L2, OUTPUT);
pinMode(R1, OUTPUT);
pinMode(R2, OUTPUT);

analogWrite(E1, SL);
analogWrite(E2, SR);
}

void loop()
{
// Dopredu
if ((digitalRead(A5) == LOW) && (digitalRead(A4) == HIGH) && (digitalRead(A3) == HIGH) && (digitalRead(A2) == HIGH))
{
analogWrite(L1, 255);
analogWrite(L2, 0);
analogWrite(R1, 0);
analogWrite(R2, 255);
delay(100);
analogWrite(L1, 0);
analogWrite(L2, 0);
analogWrite(R1, 0);
analogWrite(R2, 0);
}

// Dozadu
if ((digitalRead(A5) == HIGH) && (digitalRead(A4) == LOW) && (digitalRead(A3) == HIGH) && (digitalRead(A2) == HIGH))
{
analogWrite(L1, 0);
analogWrite(L2, 255);
analogWrite(R1, 255);
analogWrite(R2, 0);
delay(100);
analogWrite(L1, 0);
analogWrite(L2, 0);
analogWrite(R1, 0);
analogWrite(R2, 0);
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
if (ledState == LOW)
ledState = HIGH;
else
ledState = LOW;
digitalWrite(ledPin, ledState);
}
}

if ((digitalRead(A5) == HIGH) && (digitalRead(A4) == HIGH) && (digitalRead(A3) == HIGH) && (digitalRead(A2) == LOW))
{
analogWrite(L1, 255);
analogWrite(L2, 0);
analogWrite(R1, 255);
analogWrite(R2, 0);
delay(100);
analogWrite(L1, 0);
analogWrite(L2, 0);
analogWrite(R1, 0);
analogWrite(R2, 0);
}

if ((digitalRead(A5) == HIGH) && (digitalRead(A4) == HIGH) && (digitalRead(A3) == LOW) && (digitalRead(A2) == HIGH))
{
analogWrite(L1, 0);
analogWrite(L2, 255);
analogWrite(R1, 0);
analogWrite(R2, 255);
delay(100);
analogWrite(L1, 0);
analogWrite(L2, 0);
analogWrite(R1, 0);
analogWrite(R2, 0);
}
// ----------------------------------------Tlacitka-svetla -------------------------------------------------------------

// Svetla 1 - 1 bile a 1 cervene
if ((digitalRead(A5) == HIGH) && (digitalRead(A4) == LOW) && (digitalRead(A3) == LOW) && (digitalRead(A2) == HIGH))

{
digitalWrite(4, HIGH);
}

// Svetla 2 - 2 bile a 2 cervene
if ((digitalRead(A5) == HIGH) && (digitalRead(A4) == HIGH) && (digitalRead(A3) == LOW) && (digitalRead(A2) == LOW))
{
digitalWrite(6, HIGH);
digitalWrite(4, HIGH);
}

// Svetla 3 - Oranzove blikani
if ((digitalRead(A5) == HIGH) && (digitalRead(A4) == LOW) && (digitalRead(A3) == HIGH) && (digitalRead(A2) == LOW))
{
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval)
{
previousMillis = currentMillis;
if (ledState == LOW)
ledState = HIGH;
else
ledState = LOW;
digitalWrite(ledPin, ledState);
}
}

// Svetla 4 - Vypnout
if ((digitalRead(A5) == LOW) && (digitalRead(A4) == LOW) && (digitalRead(A3) == HIGH) && (digitalRead(A2) == HIGH))
{
digitalWrite(4, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
}

else
{
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval)
{
previousMillis = currentMillis;
if (ledState == LOW)
ledState = HIGH;
else
ledState = LOW;
digitalWrite(ledPin, LOW);
}
}
}

Odpovědět

Kdo je online

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