Lekce 6 - ADC - joystick, potenciometry¤
V této lekci se naučíme pracovat s ADC převodníkem a zpracovávat data, které pomocí něj získáme.
ADC používáme pro měření napětí, které je výstupem z některých senzorů.
Převádí napětí na hodnotu v rozsahu 0-1023
, kterou pak můžeme dále zpracovávat.
To využijeme pro čtení dat z potenciometru a joysticku. Své řešení opět můžeme psát do souborů z předchozích cvičení, nebo stáhnout novou kostru.
Zadání A¤
Nejprve si napíšeme program, který nám bude číst data z potenciometru a vypisovat je na monitoru.
Řešení
import * as adc from "adc";
// const INPUT_PIN = 10; // pin joysticku
const INPUT_PIN = 2 // pin potenciometru
adc.configure(INPUT_PIN); // nejdříve musíme konfigurovat pin, ze kterého chceme data číst
setInterval(() => { // každých 100 ms vyčteme data a vypíšeme je do konzole
const value = adc.read(INPUT_PIN); // pomocí funkce read čteme data z INPUT_PIN
console.log(value); //vypisujeme hodnotu do konzole
}, 100);
Zadání B¤
Data už jsme vyčetli, ale většinou je budeme muset ještě upravit.
Ve většině využití totiž nemůžeme použít číslo od 0-1023
.
Proto musíme data takzvaně přemapovat na jiný číselný rozsah, k čemuž si napíšeme funkci.
Řešení
import * as adc from "adc";
// naše nová funkce, jako parametry má velikost nového rozsahu a číslo, které chceme převést
function mapADC(targetRange: number, num: number): number {
let result: number = (num / (1023 / targetRange)); // vypočítame převod na nový rozsah
return Math.round(result); // výsledek nám často vyjde jako desetinné číslo, proto ho zaokrouhlíme
}
const INPUT_PIN = 10;
adc.configure(INPUT_PIN);
setInterval(() => {
const value = mapADC(255, adc.read(INPUT_PIN)); // pomocí naší funkce si namapujeme data na rozsah 0-255
console.log(value);
}, 100);
Zadání C¤
Napíšeme program, který bude pomocí dat z potenciometru měnit jas RGB ledky na ESP.
Řešení
import * as adc from "adc";
import { SmartLed, LED_WS2812 } from "smartled";
const INPUT_PIN = 2;
const LED_PIN = 48;
const LED_COUNT = 1;
function mapADC(targetRange: number, num: number): number{
let result: number = (num / (1023/targetRange));
return Math.round(result);
}
const ledStrip = new SmartLed(LED_PIN, LED_COUNT, LED_WS2812); // připojí pásek na pin 48, s 1 ledkou a typem WS2812
adc.configure(INPUT_PIN);
setInterval(() => {
const value = mapADC(255, adc.read(INPUT_PIN));
ledStrip.set(0, {r: value, g: 0, b:0}) // nastavíme intenzitu červené barvy na hodnotu z potenciometru (0-255)
ledStrip.show();
}, 10);
Zadání D¤
Napíšeme program, který bude číst obě osy joysticku, jedna osa bude ovládat počet svítících ledek na LED pásku, druhá osa jejich barvu.
Řešení
import * as adc from "adc";
import { SmartLed, LED_WS2812 } from "smartled";
import * as colors from "./libs/colors.js";
const JOY_X = 10;
const JOY_Y = 9;
const LED_PIN = 21;
const LED_COUNT = 8;
function mapADC(rangeFrom: number, rangeTo: number, num: number): number {
let result: number = (num / (rangeFrom / rangeTo));
return Math.round(result);
}
adc.configure(JOY_X);
adc.configure(JOY_Y);
const ledStrip = new SmartLed(LED_PIN, LED_COUNT, LED_WS2812);
setInterval(() => {
const lenght = mapADC(1023, 7, adc.read(JOY_X)); // nastaví délku na hodnotu z potenciometru (0-7)
const ledColor = mapADC(1023, 360, adc.read(JOY_Y)); // nastaví barvu na hodnotu z potenciometru (0-360)
console.log(`Lenght: ${lenght}, Color: ${ledColor}`);
ledStrip.clear(); // vymaže pásek
for (let i: number = 0; i <= lenght; i++) { // nastavíme barvu na všechny ledky v rozsahu délky
ledStrip.set(i, colors.rainbow(ledColor))
}
ledStrip.show();
}, 10);
Výstupní úkol V1¤
Napíšeme program, který bude pomocí dat ze dvou potenciometrů měnit pozici svítící ledky na LED pásku a její barvu.
Využijeme funkci colors.rainbow()
.