В данном материале мы рассмотрим довольно простой проект на Arduino, который оптимально подойдет для новичков. Мы будем управлять RGB-светодиодом, меняя положения джойстика, подключенного к Arduino.
Джойстик (в нашем случае аналоговый джойстик) по своему принципу работы похож на два соединенных вместе потенциометра: один для вертикального перемещения рукоятки (ось Y), а другой – для горизонтального перемещения (ось X). На джойстике также есть переключатель. Это может быть очень удобно для ретро-игр, управления роботами или радиоуправляемых машин.
На следующем изображении представлена координатная сетка джойстика.
RGB в названии светодиода означает цвета его свечения (R – красный, G – зеленый, B – синий). В светодиодных продуктах RGB эти три цвета сочетаются для получения более 16 миллионов оттенков света. Учтите, что возможны не все цвета. Некоторые цвета находятся «за пределами» треугольника, образованного внутренними светодиодами RGB. Кроме того, такие цвета пигмента, как коричневый или розовый, трудно или невозможно достичь.
Схема подключения джойстика к Arduino следующая.
- GND джойстика к GND платы Arduino
- Vcc джойстика к 5v платы Arduino
- VRx джойстика к линии A0 платы Arduino
- VRy джойстика к линии A1 платы Arduino
- SW (общий вывод) светодиода к линии 2 платы Arduino
- Линия красного светодиода к линии 9 платы Arduino
- Линия зеленого светодиода к линии 10 платы Arduino
- Линия синего светодиода к линии 11 платы Arduino
Код программы Arduino приведен далее.
const int PUSHBUTTON_PIN = 2;
const int RED_PIN = 11;
const int GREEN_PIN = 10;
const int BLUE_PIN = 9;
const int redX = 512;
const int redY = 1023;
const int greenX = 1023;
const int greenY = 0;
const int blueX = 0;
const int blueY = 0;
void setup() {
Serial.begin(9600);
pinMode(PUSHBUTTON_PIN, INPUT);
digitalWrite(PUSHBUTTON_PIN, HIGH);
pinMode(RED_PIN, OUTPUT);
pinMode(GREEN_PIN, OUTPUT);
pinMode(BLUE_PIN, OUTPUT);
}
void loop() {
int xAxis = analogRead(A0);
int yAxis = analogRead(A1);
xAxis = map(xAxis, 0, 1023, 0, 1023);
yAxis = map(yAxis, 0, 1023, 1023, 0);
int distanceRed = sqrt(pow(abs(redX - xAxis), 2) + pow(abs(redY - yAxis), 2));
int distanceGreen = sqrt(pow(abs(greenX - xAxis), 2) + pow(abs(greenY - yAxis), 2));
int distanceBlue = sqrt(pow(abs(blueX - xAxis), 2) + pow(abs(blueY - yAxis), 2));
int brightRed = 255 - constrain(map(distanceRed, 0, 1023, 0, 255), 0, 255);
int brightGreen = 255 - constrain(map(distanceGreen, 0, 1023, 0, 255), 0, 255);
int brightBlue = 255 - constrain(map(distanceBlue, 0, 1023, 0, 255), 0, 255);
if (digitalRead(PUSHBUTTON_PIN) == 0) {
brightRed = 255;
brightGreen = 255;
brightBlue = 255;
}
analogWrite(RED_PIN, brightRed);
analogWrite(GREEN_PIN, brightGreen);
analogWrite(BLUE_PIN, brightBlue);
Serial.print("KEY: ");
Serial.print(digitalRead(PUSHBUTTON_PIN));
Serial.print(", X: ");
Serial.print(xAxis);
Serial.print(", Y: ");
Serial.print(yAxis);
Serial.print(", R: ");
Serial.print(brightRed);
Serial.print(", G: ");
Serial.print(brightGreen);
Serial.print(", B: ");
Serial.print(brightBlue);
Serial.println("\n");
delay(100);
}
© digitrode.ru