Skip to content

Commit

Permalink
Merge pull request #61 from RoboticsBrno/LessonFixes6-10
Browse files Browse the repository at this point in the history
  • Loading branch information
JakubAndrysek authored Jul 8, 2024
2 parents 6a0ed53 + 43e10ea commit d7e4fbb
Show file tree
Hide file tree
Showing 5 changed files with 110 additions and 113 deletions.
59 changes: 32 additions & 27 deletions docs/robot/lekce10/index.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
# Lekce 10 - servo

Na ELKS jsou k dispozici dva jednoduché servo porty na levé straně ELSKu.

- `SER0` - pin 35
- `SER1` - pin 40
Na Robůtkovi je připojené servo na pinu 38

## Začátek

Expand All @@ -12,7 +9,7 @@ Abychom mohli používat servo musíme ho získat příkazem `#!ts const servo =
```ts
import { Servo } from "./libs/servo.js"

const SERVO_PIN = 35;
const SERVO_PIN = 38;
const servo = new Servo(SERVO_PIN, 1, 3);
```

Expand All @@ -23,41 +20,49 @@ servo.write(512); // 90°
servo.write(1023); // 180°
```

## Dvě serva
## Kreslení tužkou

Pokud chceme používat dvě serva, musíme změnít kanál v konfiguraci druhého serva.
Na servo se dá připojit tužka. Abychom mohli tužku ovládat musíme ji získat příkazem `#!ts cosnt pen = new Pen(<číslo pinu>)`. Robůtek má 4 předdefinované konstaty pro ovládání `UP`, `DOWN`, `MIDDLE` a `UNLOAD`.

```ts
import { Servo } from "./libs/servo.js"
import { Pen } from "./libs/robot.js"

const SERVO_PIN = 38;

const pen = new Pen(SERVO_PIN);
```

Na nastavení pozice tužky použijeme funkci `#!ts pen.move()` a do závorek zadejte číslo on 0 od 1023 nebo jednu z konstant `Pen.UP`, `Pen.DOWN`, `Pen.MIDDLE` a `Pen.UNLOAD`.

const SERVO_PIN_0 = 35;
const SERVO_PIN_1 = 40;
const servo_0 = new Servo(SERVO_PIN_0, 1, 3);
const servo_1 = new Servo(SERVO_PIN_1, 1, 4);
```ts
pen.move(Pen.DOWN); // Začne kreslit
pen.move(Pen.UP); // Přestane kreslit
pen.move(Pen.UNLOAD); // Vytáhne tužku
```

## Zadání A

Vytvořte program který bude číst data z joysticku a zapisovat je do dvou serv.
Vytvořte program, který při zmáčknutí tlačítka zasune pero a druhé tlačítko, které ho vysune.

??? note "Řešení"
```ts
import * as adc from "adc";
import { Servo } from "./libs/servo.js"
import { Pen } from "./libs/robot.js"
import * as gpio from "gpio"

const SERVO_PIN = 38;
const LBTN_PIN = 2;
const RBTN_PIN = 0;

const SERVO_PIN_0 = 35;
const SERVO_PIN_1 = 40;
const POT_PIN_X = 9;
const POT_PIN_Y = 10;
gpio.pinMode(LBTN_PIN, gpio.PinMode.INPUT);
gpio.pinMode(RBTN_PIN, gpio.PinMode.INPUT);

adc.configure(POT_PIN_X);
adc.configure(POT_PIN_Y);
const pen = new Pen(SERVO_PIN);

const servo_0 = new Servo(SERVO_PIN_0, 1, 3);
const servo_1 = new Servo(SERVO_PIN_1, 1, 4);
gpio.on("falling", LBTN_PIN, () => {
pen.move(Pen.DOWN);
});

setInterval(() => {
servo_0.write(adc.read(POT_PIN_X));
servo_0.write(adc.read(POT_PIN_Y));
}, 25);
gpio.on("falling", RBTN_PIN, () => {
pen.move(Pen.UP);
});
```
32 changes: 16 additions & 16 deletions docs/robot/lekce6/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,23 +10,23 @@ Své řešení opět můžeme psát do souborů z předchozích cvičení, nebo

Nejprve se naučíme, jak číst data z jednoho senzoru ze senzorů kolem kol a vypisovat je na monitoru:

```ts
import * as gpio from "gpio";
import * as adc from "adc";
```ts
import * as gpio from "gpio";
import * as adc from "adc";

const SENSOR_PIN: number = 4; // pin levého předního senzoru u kola z pohledu zvrchu
const LIGHTN_PIN: number = 47; // pin na zapnutí podsvícení pro senzory
const SENSOR_PIN: number = 4; // pin levého předního senzoru u kola z pohledu zvrchu
const LIGHTN_PIN: number = 47; // pin na zapnutí podsvícení pro senzory

adc.configure(SENSOR_PIN, adc.Attenuation.Db0); // pin senzoru nakonfigurujeme s útlumem nastaveným na 0
adc.configure(SENSOR_PIN); // nakonfigurujeme pin senzoru

gpio.pinMode(LIGHTN_PIN, gpio.PinMode.OUTPUT); // nastavíme mód pinu podsvícení na output
gpio.write(LIGHTN_PIN, 1); // zapneme podsvícení robůtka
gpio.pinMode(LIGHTN_PIN, gpio.PinMode.OUTPUT); // nastavíme mód pinu podsvícení na output
gpio.write(LIGHTN_PIN, 1); // zapneme podsvícení robůtka

setInterval(() => { // každých 100 ms vyčteme data a vypíšeme je do konzole
const value = adc.read(SENSOR_PIN); // pomocí funkce read čteme data z SENZOR_PIN
console.log(value); //vypisujeme hodnotu do konzole
}, 100);
```
setInterval(() => { // každých 100 ms vyčteme data a vypíšeme je do konzole
const value = adc.read(SENSOR_PIN); // pomocí funkce read čteme data z SENZOR_PIN
console.log(value); //vypisujeme hodnotu do konzole
}, 100);
```

## Zadání A

Expand All @@ -48,7 +48,7 @@ Proto musíme data takzvaně přemapovat na jiný číselný rozsah, k čemuž s
const SENSOR_PIN: number = 4; // pin levého předního senzoru u kola z pohledu zvrchu
const LIGHTN_PIN: number = 47; // pin na zapnutí podsvícení pro senzory

adc.configure(SENSOR_PIN, adc.Attenuation.Db0); // pin senzoru nakonfigurujeme s útlumem nastaveným na 0
adc.configure(SENSOR_PIN); // nakonfigurujeme pin senzoru

gpio.pinMode(LIGHTN_PIN, gpio.PinMode.OUTPUT); // nastavíme mód pinu podsvícení na output
gpio.write(LIGHTN_PIN, 1); // zapneme podsvícení robůtka
Expand Down Expand Up @@ -81,7 +81,7 @@ Napíšeme program, který bude pomocí dat z senzoru kolem kol měnit jas RGB L
}

const ledStrip: SmartLed = new SmartLed(LED_PIN, LED_COUNT, LED_WS2812); // připojí pásek na pin LED_PIN, s LED_COUT ledkami a typem WS2812
adc.configure(SENSOR_PIN, adc.Attenuation.Db0); // pin senzoru nakonfigurujeme s útlumem nastaveným na 0
adc.configure(SENSOR_PIN); // nakonfigurujeme pin senzoru

gpio.pinMode(LIGHTN_PIN, gpio.PinMode.OUTPUT); // nastavíme mód pinu podsvícení na output
gpio.write(LIGHTN_PIN, 1); // zapneme podsvícení robůtka
Expand Down Expand Up @@ -111,7 +111,7 @@ Senzorů čáry a senzorů kolem kol je dohromady 8, ale pro zmenšení počtu v
const LIGHTN_PIN: number = 47; // pin na zapnutí podsvícení pro senzory
const SENSOR_SWITCH_PIN: number = 8; // pin na přepnutí mezi senzory u kola a senzory čáry

adc.configure(SENSOR_PIN, adc.Attenuation.Db0); // pin senzoru nakonfigurujeme s útlumem nastaveným na 0
adc.configure(SENSOR_PIN); // nakonfigurujeme pin senzoru

gpio.pinMode(LIGHTN_PIN, gpio.PinMode.OUTPUT); // nastavíme mód pinu podsvícení na output
gpio.pinMode(SENSOR_SWITCH_PIN, gpio.PinMode.OUTPUT);
Expand Down
39 changes: 20 additions & 19 deletions docs/robot/lekce7/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,36 +45,37 @@ Složku si můžete rozbalit jako project7.

## Zadání A

Opět navážeme na předchozí lekce, a budeme do pole ukládat hodnoty z potenciometru.
Vytvoříme si pole, které při stisku vybraného tlačítka přidá aktuální hodnotu z `POT 0`.
Opět navážeme na předchozí lekce, a budeme do pole ukládat hodnoty ze sensoru.
Vytvoříme si pole, které při stisku vybraného tlačítka přidá aktuální hodnotu z ADC převodníku.
Druhé tlačítko z tohoto pole poslední hodnotu smaže.
Stav pole si můžeme po každé změně vypsat pomocí `#!ts console.log(pole)`.

??? note "Řešení"
```ts
import { SmartLed, LED_WS2812 } from "smartled";
import * as colors from "./libs/colors.js";
import * as adc from "adc";
import * as gpio from "gpio";
const INPUT_PIN : number = 2;
const LED_PIN : number = 21;
const LED_COUNT : number = 8;
const BTN_PIN : number = 18;
const MBTN_PIN : number = 16;
const SENSOR_PIN: number = 4; // pin levého předního senzoru u kola z pohledu zvrchu
const LIGHTN_PIN: number = 47; // pin na zapnutí podsvícení pro senzory
const ledStrip = new SmartLed(LED_PIN, LED_COUNT); // Nastavíme LED pásek
gpio.pinMode(BTN_PIN, gpio.PinMode.INPUT); // Nastavíme levé tlačítko
gpio.pinMode(MBTN_PIN, gpio.PinMode.INPUT); // Nastavíme střední tlačítko
adc.configure(INPUT_PIN); // Nastavíme vstup z POT0
const LBTN_PIN : number = 2; // pin levého tlačítka
const RBTN_PIN : number = 0; // pin pravého tlačítka
gpio.pinMode(LBTN_PIN, gpio.PinMode.INPUT); // nastavíme levé tlačítko
gpio.pinMode(RBTN_PIN, gpio.PinMode.INPUT); // nastavíme pravé tlačítko
adc.configure(SENSOR_PIN); // nakonfigurujeme pin senzoru
gpio.pinMode(LIGHTN_PIN, gpio.PinMode.OUTPUT); // nastavíme mód pinu podsvícení na output
gpio.write(LIGHTN_PIN, 1); // zapneme podsvícení robůtka
let arr : number[] = [];
gpio.on("falling", BTN_PIN, () => { // Při stisknutí levého tlačítka
arr.push(adc.read(INPUT_PIN)); // Přidáme do pole naměřenou hodnotu
gpio.on("falling", LBTN_PIN, () => { // Při stisknutí levého tlačítka
arr.push(adc.read(SENSOR_PIN)); // Přidáme do pole naměřenou hodnotu
console.log(arr); // Vypíšeme nový stav
});
gpio.on("falling", MBTN_PIN, () => { // Při stisknutí středního tlačítka
gpio.on("falling", RBTN_PIN, () => { // Při stisknutí pravého tlačítka
arr.pop(); // Odebereme z pole poslední hodnotu
console.log(arr); // Vypíšeme nový stav
});
Expand All @@ -83,12 +84,12 @@ Stav pole si můžeme po každé změně vypsat pomocí `#!ts console.log(pole)`
## Výchozí úkol V1

Tentokrát si vytvoříme o něco rozsáhlejší program, který naváže na předchozí úkol.
Vytvoříme si pole čísel, do kterého pomocí prvního tlačítka načteme naměřené hodnoty z potenciometru.
Vytvoříme si pole čísel, do kterého pomocí prvního tlačítka načteme naměřené hodnoty z ADC převodníku.
Při stisku prvního tlačítka kontrolujeme, jestli už pole má délku 8.
Pokud už je délka 8, další hodnoty nepřidáváme a stisk tlačítka pole nezmění.

Druhé tlačítko smaže poslední prvek -- zde kontrolujeme, jestli tam nějaký prvek je.

Třetí tlačítko na základě hodnot v poli rozsvítí LED pásek podle naměřených hodnot.
Při každé změně hodnot v poli se rozsvítí LED pásek podle naměřených hodnot.
Všechny hodnoty v poli převedeme na rozsah `colors.rainbow` (tedy 0-360) a rozsvítíme LED
na odpovídajícím indexu naměřenou hodnotou.
na odpovídajícím indexu naměřenou hodnotou.
17 changes: 10 additions & 7 deletions docs/robot/lekce8/index.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Lekce 8 - Řetězce
# Lekce 8 - řetězce

Zatím jsme se zařízením po nahrání programu komunikovali jednostranně: pomocí `#!ts console.log()` jsme vypisovali různé věci na výstup, a ten jsme sledovali pomocí příkazu `Monitor`.

Expand Down Expand Up @@ -59,24 +59,27 @@ Tato funkce bere jako argument řetězec; pokud argument není řetězec, přede

Jako první úkol si vyzkoušíme spojit řetězec a číslo s tím, co už známe:

Napíšeme program, který při stisku tlačítka vypíše na výstup `"Potenciometr naměřil X."`, kde X je aktuální hodnota naměřená z `POT0`.
Napíšeme program, který při stisku tlačítka vypíše na výstup `"Senzor naměřil X."`, kde X je aktuální hodnota naměřená z ADC převodníku.

??? note "Řešení"
```ts
import * as gpio from "gpio";
import * as adc from "adc";
const BTN_LEFT = 2;
const BTN_LEFT = 18;
const POT0_PIN = 2;
const SENSOR_PIN: number = 4;
const LIGHTN_PIN: number = 47;
gpio.pinMode(BTN_LEFT, gpio.PinMode.INPUT);
adc.configure(POT0_PIN);
adc.configure(SENSOR_PIN);
gpio.pinMode(LIGHTN_PIN, gpio.PinMode.OUTPUT);
gpio.write(LIGHTN_PIN, 1);
gpio.on("falling", BTN_LEFT, () => {
console.log("Potenciometr naměřil " + adc.read(POT0_PIN) + ".");
console.log("Senzor naměřil " + adc.read(SENSOR_PIN) + ".");
});
```

Expand Down
76 changes: 32 additions & 44 deletions docs/robot/lekce9/index.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Lekce 9 - radio

Na ELKS je k dispozici jednoduchá bezdrátová komunikace na vzdálenost jednotek metrů.
Na ELKSRobůtkovi je k dispozici jednoduchá bezdrátová komunikace na vzdálenost jednotek metrů.

- Až 16 "skupin", všechny desky ve stejné skupině přijmají zprávy od všech ostatních zároveň
- Podporuje tři datové typy:
Expand Down Expand Up @@ -113,77 +113,65 @@ radio.off("keyvalue");

## Zadání A

Vytvořte program, který pomocí klíč-hodnota bude přes rádio odesílat stav tří tlačítek na desce
Vytvořte program, který pomocí klíč-hodnota bude přes rádio odesílat stav dvou tlačítek na desce
(stisknuto == `1`, nestisknuto == `0`).
Zároveň bude reagovat na příchozí hodnoty a rosvicovat první 3 LED na desce podle příchozího stavu.
Zároveň bude reagovat na příchozí hodnoty a rosvicovat první 2 LED na LED pásku podle příchozího stavu.

Jako klíče použijte `sw0`, `sw1` a `sw2`. Vždy, když přijde klíč `sw0` s hodnotou 1, rozsvítíte LED-G, a když 0, tak ji zhasnete,
a stejně tak pro další dvě tlačítka a LED.
Jako klíče použijte `IO0` a `IO2`. Vždy, když přijde klíč `IO0` s hodnotou 1, rozsvítíte LED na indexu 1, a když 0, tak ji zhasnete,
a stejně tak pro další tlačítko a LED.

Najděte kamaráda, abyste si mohli navzájem zkusit, zda program funguje (jeden vysílá, druhý přijmá).

??? note "Řešení"
```ts
import * as radio from "simpleradio";
import * as gpio from "gpio";
import { SmartLed, LED_WS2812 } from "smartled";
import * as colors from "./libs/colors.js";

radio.begin(5); // skupina 5

const PIN_SW0 = 18;
const PIN_SW1 = 16;
const PIN_SW2 = 42;
const PIN_BTN_LEFT = 2;
const PIN_BTN_RIGHT = 0;

const PIN_LED0 = 17;
const PIN_LED1 = 15;
const PIN_LED2 = 45;
const LED_PIN = 48;
const LED_COUNT = 3;

// Nastavíme tlačítka jako vstupy
gpio.pinMode(PIN_SW0, gpio.PinMode.INPUT);
gpio.pinMode(PIN_SW1, gpio.PinMode.INPUT);
gpio.pinMode(PIN_SW2, gpio.PinMode.INPUT);
gpio.pinMode(PIN_BTN_LEFT, gpio.PinMode.INPUT);
gpio.pinMode(PIN_BTN_RIGHT, gpio.PinMode.INPUT);

gpio.on("falling", PIN_SW0, () => {
// Při stisknutí tlačítka 0
radio.sendKeyValue("sw0", 1); // odešleme hodnotu 1 s klíčem sw0
gpio.on("falling", PIN_BTN_LEFT, () => {
// Při stisknutí tlačítka 0
radio.sendKeyValue("IO2", 1); // odešleme hodnotu 1 s klíčem sw0
});
gpio.on("rising", PIN_SW0, () => {
// Při uvolnění tlačítka 0
radio.sendKeyValue("sw0", 0); // odešleme hodnotu 0 s klíčem sw0
gpio.on("rising", PIN_BTN_LEFT, () => {
// Při uvolnění tlačítka 0
radio.sendKeyValue("IO2", 0); // odešleme hodnotu 0 s klíčem sw0
});

gpio.on("falling", PIN_SW1, () => {
radio.sendKeyValue("sw1", 1);
gpio.on("falling", PIN_BTN_RIGHT, () => {
radio.sendKeyValue("IO0", 1);
});
gpio.on("rising", PIN_SW1, () => {
radio.sendKeyValue("sw1", 0);
gpio.on("rising", PIN_BTN_RIGHT, () => {
radio.sendKeyValue("IO0", 0);
});

gpio.on("falling", PIN_SW2, () => {
radio.sendKeyValue("sw2", 1);
});
gpio.on("rising", PIN_SW2, () => {
radio.sendKeyValue("sw2", 0);
});



// Nastavíme LED piny jako výstupy
gpio.pinMode(PIN_LED0, gpio.PinMode.OUTPUT);
gpio.pinMode(PIN_LED1, gpio.PinMode.OUTPUT);
gpio.pinMode(PIN_LED2, gpio.PinMode.OUTPUT);
const strip = new SmartLed(LED_PIN, LED_COUNT);

// Zpracování příchozích správ
radio.on("keyvalue", (klic, hodnota, info) => {
if (klic === "sw0") {
gpio.write(PIN_LED0, hodnota);
} else if (klic === "sw1") {
gpio.write(PIN_LED1, hodnota);
} else if (klic === "sw2") {
gpio.write(PIN_LED2, hodnota);
}
if (klic === "IO0") {
strip.set(1, colors.rainbow(0, hodnota * 10))
} else if (klic === "IO2") {
strip.set(2, colors.rainbow(150, hodnota * 10))
}

strip.show();
});
```

## Výchozí úkol V1

Změňtě program ze zadání A tak, aby místo tlačítek vyčítal potenciometr, a místo ledek rozsvicoval LED pásek. Je na vás, zda vzládnete rozsvicovat a pohybovat duhou, nebo pouze jednou z LED podle toho, jak se natočí potenciometr na vysílači.
Změňtě program ze zadání A tak, aby místo tlačítek vyčítal ADC převodník. Na LED pásku se bude zobrazovat hondota z ADC.

0 comments on commit d7e4fbb

Please sign in to comment.