Autor: Jan Klokan

Motory

SERVOMOTOR

princip: motor, kterému zadáváme úhel, na který se má natočit

zapojení:

How Servo Motor Works & Interface It With Arduino - Last Minute Engineers                               Arduino Servo Motor: Reference Code and Wiring Example

kód:

#include <Servo.h>

Servo myservo;

int pos = 0;

void setup() {
  myservo.attach(9);
}

void loop() {
  for (pos = 0; pos <= 180; pos += 1) {
    myservo.write(pos);
    delay(15);
  } 
  for (pos = 180; pos >= 0; pos -= 1) {
    myservo.write(pos);
    delay(15);
  }
}

 

 

KROKOVÝ MOTOR

———–

STEJNOSMĚRNÝ MOTOR

———–

IR ovládání

https://www.hwkitchen.cz/navody-hwkitchen/bezdratove-ovladani-pomoci-ir-ovladace-arduino-navody/

IR přijímače

 

IR vysílače

 

 

  • Princip

    • Světlo v oblasti neviditelné pro člověka
    • Vysílání impulsů skrývající kód
    • Komunikace na krátké vzdálenosti
    • Modulace signálu v určité frekvenci

Infrared (IR) Communication Using PHPoC - PHPoC Forum

 

Zapojení

schéma zapojení IR diody, jako ovladač k TV - Arduino návody

How to use IR Receiver and IR Remote | IR RECEIVER module - SriTu Hobby

u IR diody 220 Ohm rezistor

 

 

Program

kódy doporučuju nekopírovat, stránka vkládá neviditelné znaky a mění znak a kód poté není funkční

 

příjimač

#include <IRremote.h>

int RECV_PIN = 11;

IRrecv irrecv(RECV_PIN);

decode_results  results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn();  // Start the receiver
}

void loop() {
  if (irrecv.decode(&results))  {
   
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive  the next value
  }
}

//

vysílač

#include <IRremote.h>

IRsend irsend;

void setup() {
  Serial.begin(9600);
  pinMode(5, INPUT_PULLUP); // button
  // The IR LED is connected to pin 3 (PWM ~) on the Arduino
}

void loop() {
  if (digitalRead(5) == LOW) {
    irsend.sendNEC(0x34895725, 32);
    Serial.println("Code sent!");
    delay(30);
  } 

  delay(100);
}

 

Otázky

  • Mohu pomocí infračervené diody posílat dálkovým ovládáním data do arduina?
    • Ano, můžeme. Ale potřebné data či příkazy zakódujeme do binární kombinaci. Takže například pokud získáme kód 0x12 rozsvítíme červenou LED a pokud kód 0x15 tak modrou LED.
  • Může infra-dioda data také odesílat?
    • Infradioda může data pouze odesílat. Data jako taková neodesílá, ale rozsvicí se a zhasíná v určité frekvenci a kódu, který šifrujeme. Pro čtení tohoto světla se využívá IR příjimač.
  • Můžou komunikovat dvě arduina?
    • Ano, můžou. Obě arduina musí mít příjimač a vysílač. Vytvoříme si kódy pro jednotlivé příkazy a tyto příkazy musí znát obě arduina.

 

Úkoly

  1. Mějme IR ovladač a tři LED různých barev, pomocí tlačítek 1, 2 a 3 na ovladači zapínejme a vypínejme LED. První zmáčknutí znamená zapnout, druhé vypnout atd.
  2. Mějme dvě arduina, jedno s příjímačem a druhý s vysílačem. Odešleme text a přijmeme ho na druhém arduinu.
  3. Mějme jednu LED a arduino s příjímačem. Pomocí tlačítek plus a mínus na ovladačí ovládáme intenzitu svitu LED.
  4. Mějme sedmisegmentový displej a arduino s příjimačem. Podle zmáčknutého tlačítka na ovladači rozsvítíme cifru na displeji.

Přístupový systém

Zadání:

Simulace přístupového systému pomocí arduina. Pokud je detekován čip, který má oprávněný přístup, zvonek udělá krátké pípnutí, rozsvítí se zelená LED a na displeji se pozdraví uživatel daného čipu. Pokud se detekuje čip, který není oprávněný, bzučák se rozpípá, rozsvítí se červená LED a na displeji se ukáže text „neoprávněný vstup“.

video: https://photos.app.goo.gl/afK8xV1VY9NqHDxc8

 

Schéma:

https://www.tinkercad.com/things/lSWuPmMTesC-mcs-pristupovy-system

 

RFID:

Pin Wiring to Arduino Uno
SDA Digital 10
SCK Digital 13
MOSI Digital 11
MISO Digital 12
IRQ unconnected
GND GND
RST Digital 9
3.3V 3.3V

 

 

Kód:

Displej:

#include 

// definice pinu
int PinDisplayRS = 3;
int PinDisplayE = 4;
int PinDisplayD4 = 5;
int PinDisplayD5 = 6;
int PinDisplayD6 = 7;
int PinDisplayD7 = 8;

// definice displeje
LiquidCrystal lcd(PinDisplayRS, PinDisplayE, PinDisplayD4, PinDisplayD5, PinDisplayD6, PinDisplayD7);

void setup() {
  // inicializace displeje
  lcd.begin(16, 2);

}

void loop() {
  lcd.setCursor(0, 0); // nulty radek, nulty sloupec
  lcd.print("Hello World!"); // vypsani textu "hello world"

  lcd.setCursor(0, 1); // prvni radek, nulty sloupec
  lcd.print(millis() / 1000); // vypsani uplynuleho casu v ms/1000 (takze v sekundach)

  delay(1000);
}

 

RFID:

#include 
#include 

int SS_PIN = 10;
int RST_PIN = 9;

MFRC522 rfid(SS_PIN, RST_PIN);   // vytvoreni objektu RFID

void setup() {
  Serial.begin(9600);       // zahajeni seriove komunikace
  SPI.begin();              // zahajeni SPI pro RFID modul
  rfid.PCD_Init();          // inicializace RFID
  Serial.println("Pripraveno na skenovani");
}

void loop() {
  // podminka pokud ctecka nasla kartu
  if (rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) {
    Serial.print("Karta detekovana! UID: ");
    
    // vypsani kazde casti UID kodu pomoci hexadecimalniho kodu
    for (byte i = 0; i < rfid.uid.size; i++) {
      Serial.print(rfid.uid.uidByte[i], HEX);
      Serial.print(" ");
    }
    Serial.println();  // novy radek

    rfid.PICC_HaltA();  // ukonceni cteni a priprava na dalsi cteni
  }
}

Přístupový systém:

tajné

Volba režimu pomocí potenciometru s displejem

Funkce:

Budeme simulovat volbu programu pomocí potenciometru. Budeme mít 10 režimů, které budeme volit otáčením potenciometru. Číslo programu bude zobrazeno na displeji. Jakmile narazíme na krajní program (0 nebo 9), tak svítí LED a zároveň pípne bzučák.

Potřebné znalosti: ovládání LED, čtení analogové hodnoty z potenciometru, ovládání bzučáku

Programové znalosti: proměnné, pole, funkce

 

Schéma:

https://www.tinkercad.com/things/c9GrZJ1e49I-mcs-volba-rezimu

Kód:

int PotPin = 0;
int LedPin = 9;
int BuzzerPin = 10;

int lastNum = 0;

int disCombination [10][7]= {
  {1,1,1,1,1,1,0},
  {0,1,1,0,0,0,0},
  {1,1,0,1,1,0,1},
  {1,1,1,1,0,0,1},
  {0,1,1,0,0,1,1},
  {1,0,1,1,0,1,1},
  {1,0,1,1,1,1,1},
  {1,1,1,0,0,0,0},
  {1,1,1,1,1,1,1},
  {1,1,1,0,0,1,1}
};



void beep(float time, int freq){
  unsigned long duration = time * 1000; // doba trvani v ms
  unsigned long end_time = millis() + duration; // konecny cas

  while (millis() < end_time) {
    digitalWrite(BuzzerPin, HIGH);
    delayMicroseconds(500000/freq);  // 1s deleno polovina frekvence
    digitalWrite(BuzzerPin, LOW);
    delayMicroseconds(500000/freq);  // 1s deleno polovina frekvence
  }
}



void setup() {
  pinMode(PotPin, INPUT); // nastaveni pinu pro potenciometr na vstup
  pinMode(LedPin, OUTPUT); // nastaveni pinu pro LED na vystup
  pinMode(BuzzerPin, OUTPUT); // nastaveni pinu pro bzucaku na vystup

  for(int i = 2; i < 9; i++){ // nastaveni vsech pinu pro displej na vystup
    pinMode(i, OUTPUT);
  }
}

void loop() {
  int value = analogRead(PotPin);
  int num = value/103;

  for(int i = 2; i < 9; i++){ // nastaveni vsech pinu pro displej na vystup
    digitalWrite(i, disCombination[num][i-2]);
  }

  if((num == 0) || (num == 9))digitalWrite(LedPin, HIGH);
  else digitalWrite(LedPin,LOW);

  if(((lastNum != 0) && (num == 0))||((lastNum != 9) && (num == 9))) beep(0.5, 6000);

  delay(50);
  lastNum = num;
}

Základní příkazy

  1. Základní struktura programu

void setup() {

// Kód zde se provede jednou po spuštění

}

 

void loop() {

// Kód zde se opakuje stále dokola

}

 

  1. Funkce pro práci s piny
  • pinMode(pin, režim) – Nastaví pin do režimu INPUT, OUTPUT

 

  • digitalWrite(pin, hodnota) – Nastaví pin na HIGH (logická 1, napětí 5V) nebo LOW (logická 0, napětí 0V).
  • digitalRead(pin) – Čte stav digitálního pinu (HIGH nebo LOW).

 

  • analogWrite(pin, hodnota) – Přiřadí pin na PWM hodnotu

(rozsah 0–255, kde 0 je LOW a 255 je HIGH).

  • analogRead(pin) – Čte hodnotu z analogového pinu (rozsah 0–1023).

int hodnota = analogRead(A0);  // Čte hodnotu z pinu A0

 

  1. Proměnné

Proměnné slouží k ukládání dat různých typů.

  • Datové typy: int, float, char, boolean, long

 

int cislo = 42;     // celé číslo (−32,768 až 32,767)

long velkeCislo = 484564; // velké celé číslo (−2,147,483,648 až 2,147,483,647)

float teplota = 36.5;     // desetinné číslo

char znak = ‚A‘;     // jeden znak

bool stav = true;     // pravda/nepravda – true/false

 

  1. Podmínky

Podmínky slouží k rozhodování na základě různých podmínek.

  • if, else

 

if (…) {

// Pokud platí podmínka, provede se tento blok

} else {

// Jinak se provede tento blok

}

  • podmínky
    • rovnost –     if (a == b){ }
    • větší než –    if (a > b){ }
    • menší než –    if (a < b){ }

 

  1. Cykly

Cykly umožňují opakování bloku kódu.

  • for: Opakuje blok kódu daný počet opakování.

for (int i = 0; i < 10; i++) {

// Tento blok se provede 10x

}

 

  • while: Provádí blok kódu, dokud je podmínka splněna.

while (digitalRead(7) == LOW) {

// Tento blok se provádí, dokud je pin 7 LOW

}

 

  1. Zpoždění
  • delay(ms) – Zastaví program na určitou dobu (v milisekundách).

 

  1. Sériová komunikace

Pro komunikaci mezi Arduinem a počítačem.

  • Serial.begin(9600) – Spustí sériovou komunikaci na určité rychlosti (9600)
  • Serial.print() a Serial.println() – Tiskne data do sériového monitoru.

 

Řízení jasu LED pomocí potenciometru

Schéma:

https://www.tinkercad.com/things/j2WzJ839zt2-mcs-led-brightness

 

Kód:

pro pulsování LEDky:

int ledPin = 3;

void setup() {
  pinMode(ledPin, OUTPUT);
}

void loop() {
  for(int i = 0; i < 256; i++){
    analogWrite(ledPin, i);
    delay(10);
  }
  for(int i = 255; i > 0; i--){
    analogWrite(ledPin, i);
    delay(10);
  }
}

pro ovládání jasu pomocí potenciometru:

int ledPin = 3;
int potPin = 0;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(potPin, INPUT);
}

void loop() {
  int value = analogRead(potPin);    // hodnoty od 0 do 1023
  analogWrite(ledPin, value/4);    // lze zapisovat hodnoty 0 do 255
}

RGB led

odkaz pro barvy: https://www.w3schools.com/colors/colors_rgb.asp

 

Schéma:

 

https://www.tinkercad.com/things/5OeQokDZRpw-mcs-rgbled

 

Kód:

int redPin= 2;
int greenPin = 4;
int bluePin = 3;

// bila (255,255,255)
// zluta (255,255,0)
// fialova (255,0,255)
// modrozelena (0,255,255)

void setup() {
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
}

void loop() {
  analogWrite(redPin, 255);
  analogWrite(greenPin, 255);
  analogWrite(bluePin, 255);
}