====== Наборы «Драгстер»: исходный код проектов ======
===== Базовый набор «Драгстер» =====
{{ :dragster:dragster_title.png?nolink&700 |}}
===== Обрати внимание! =====
Мы регулярно обновляем наши наборы. Проверь, какая версия досталась тебе! Для этого посмотри на обратную сторону обложки буклета. Если на ней **нет значка** с текстом «а2» как на картинке снизу, то [[http://wiki.amperka.ru/dragster-a1|тебе сюда]].
{{ :dragster:dragster_version_screenshot.png?nolink&400 |}}
==== Исходники ====
=== 1. Запуск ===
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
}
=== 2. Индикация ===
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
}
=== 3. Ключ на старт ===
void setup() {
pinMode(10, INPUT);
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
if (digitalRead(10) == LOW) {
digitalWrite(LED_BUILTIN, HIGH);
} else {
digitalWrite(LED_BUILTIN, LOW);
}
}
=== 4. Прогрев двигателей ===
void setup() {
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
digitalWrite(4, HIGH);
digitalWrite(7, HIGH);
}
void loop() {
analogWrite(5, 64);
analogWrite(6, 64);
delay(1000);
analogWrite(5, 0);
analogWrite(6, 0);
delay(1000);
}
=== 5. Змейка ===
#define DIR1 4
#define DIR2 7
#define EN1 5
#define EN2 6
void setup() {
pinMode(DIR1, OUTPUT);
pinMode(EN1, OUTPUT);
pinMode(EN2, OUTPUT);
pinMode(DIR2, OUTPUT);
digitalWrite(DIR1, HIGH);
digitalWrite(DIR2, HIGH);
analogWrite(EN1, 45);
analogWrite(EN2, 90);
}
void loop() {
}
=== 6. Тюнинг. Библиотеки ===
[[https://github.com/amperka/Dragster/archive/1.0.0.zip|Библиотека Dragster]]
- Нажми на ссылку библиотеки — браузер скачает zip-архив.
- Открой в Arduino IDE и перейди в меню
Скетч
Подключить библиотеку
Добавить .ZIP библиотеку…
- В окне выбора файла открой скачанный zip-архив и нажми Open.
- Библиотека готова к использованию.
#include "Dragster.h"
Dragster robot(MMAX_16_OHM);
void setup() {
robot.begin();
// robot.begin(SWAP_RIGHT);
// robot.begin(SWAP_LEFT);
// robot.begin(SWAP_BOTH);
}
void loop() {
robot.drive(110, 50);
delay(1000);
robot.drive(50, 110);
delay(1000);
}
=== 7. Стоп-сигнал ===
[[https://github.com/amperka/TroykaLedMatrix/archive/1.0.2.zip|Библиотека TroykaLedMatrix]]
[[продукты:troyka-led-matrix|Подробное описание]] LED-матрицы.
#include "Dragster.h"
#include "TroykaLedMatrix.h"
Dragster robot(MMAX_16_OHM);
TroykaLedMatrix matrix;
uint8_t stop[] {
0b11111111,
0b11111111,
0b11111111,
0b11111111,
0b11111111,
0b11111111,
0b11111111,
0b11111111,
};
void setup() {
robot.begin();
matrix.begin();
}
void loop() {
matrix.clear();
robot.drive(120, 120);
delay(1000);
matrix.drawBitmap(stop);
robot.drive(0, 0);
delay(1000);
}
=== 8. Поворотники ===
[[https://amperka.github.io/led-matrix-editor/|Редактор изображений]]
#include "Dragster.h"
#include "TroykaLedMatrix.h"
Dragster robot(MMAX_16_OHM);
TroykaLedMatrix matrix;
const byte IMAGES[][8] = {
{0x18, 0x3c, 0x7e, 0xdb, 0x99, 0x18, 0x18, 0x18},
{0x18, 0x18, 0x18, 0x99, 0xdb, 0x7e, 0x3c, 0x18}
};
const int IMAGES_LEN = sizeof(IMAGES) / 8;
void setup() {
robot.begin();
matrix.begin();
}
void loop() {
matrix.drawBitmap(IMAGES[0]);
robot.drive(110, 60);
delay(1000);
matrix.drawBitmap(IMAGES[1]);
robot.drive(60, 110);
delay(1000);
}
=== 9. Реклама спонсоров ===
#include "TroykaLedMatrix.h"
TroykaLedMatrix matrix;
const byte IMAGES[][8] = {
{0x30, 0x78, 0xcc, 0xcc, 0xfc, 0xcc, 0xcc, 0x00},
{0xc6, 0xee, 0xfe, 0xfe, 0xd6, 0xc6, 0xc6, 0x00},
{0xfc, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xf0, 0x00},
{0xfe, 0x62, 0x68, 0x78, 0x68, 0x62, 0xfe, 0x00},
{0xfc, 0x66, 0x66, 0x7c, 0x6c, 0x66, 0xe6, 0x00},
{0xe6, 0x66, 0x6c, 0x78, 0x6c, 0x66, 0xe6, 0x00},
{0x30, 0x78, 0xcc, 0xcc, 0xfc, 0xcc, 0xcc, 0x00},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
};
const int IMAGES_LEN = sizeof(IMAGES) / 8;
byte shift = 0;
void setup() {
matrix.begin();
}
void loop() {
delay(70);
matrix.marquee(IMAGES, IMAGES_LEN, shift++);
if (shift == IMAGES_LEN * 8) {
shift = 0;
}
}
=== 10. Уровень заряда ===
#include "TroykaLedMatrix.h"
TroykaLedMatrix matrix;
byte valume[8] =
{0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff};
byte diagram[8] = {0, 0, 0, 0, 0, 0, 0, 0};
float R1 = 10000;
float R2 = 36000;
void setup() {
matrix.begin();
pinMode(A1, INPUT);
}
void loop() {
delay(200);
int adcValue = analogRead(A1);
float V = adcValue * 5.0 / 1023.0;
float Vbat = V * (R1 + R2) / R2;
int matrixValue = (Vbat - 3.2) * 8;
for (int i = 0; i < 8; i++) {
if (i < matrixValue) {
diagram[i] = valume[i];
} else {
diagram[i] = 0x00;
}
}
matrix.drawBitmap(diagram);
}
=== 11. Энкодер ===
#include "Dragster.h"
#define ENC1 0
Dragster robot(MMAX_16_OHM);
void setup() {
pinMode(ENC1, INPUT);
Serial.begin(115200);
}
void loop() {
Serial.println(digitalRead(ENC1));
delay(100);
}
#include "Dragster.h"
#define ENC1 0
#define ENC2 1
Dragster robot;
void setup() {
Serial.begin(115200);
pinMode(ENC1, INPUT);
pinMode(ENC2, INPUT);
robot.begin();
robot.drive(120, 120);
}
void loop() {
Serial.print(digitalRead(ENC1));
Serial.print(" ");
Serial.println(digitalRead(ENC2));
delay(100);
}
=== 12. Умные энкодеры ===
#include "Dragster.h"
Dragster robot(MMAX_16_OHM);
int counter = 0;
void leftEncoder() {
counter++;
}
void rightEncoder() {
}
void setup() {
robot.begin();
robot.encodersBegin(leftEncoder, rightEncoder);
robot.drive(60, 0);
Serial.begin(115200);
}
void loop() {
Serial.println(counter);
delay(200);
}
=== 13. Одометр ===
#include "Dragster.h"
Dragster robot(MMAX_16_OHM);
float left = 0;
float right = 0;
void leftEncoder() {
left = left + 9.42;
}
void rightEncoder() {
right = right + 9.42;
}
void setup() {
robot.begin();
robot.encodersBegin(leftEncoder, rightEncoder);
robot.drive(100, 120);
Serial.begin(115200);
}
void loop() {
Serial.print(left);
Serial.print(" ");
Serial.print(right);
Serial.println();
delay(20);
}
=== 14. Спидометр ===
#include "Dragster.h"
#include "TroykaLedMatrix.h"
Dragster robot(MMAX_16_OHM);
TroykaLedMatrix matrix;
byte diagram[8];
int speed = 0;
void handler() {
speed++;
}
void setup() {
robot.begin();
robot.encodersBegin(handler, handler);
robot.drive(40, 80);
matrix.begin();
}
void loop() {
for (int i = 0; i < 8; i++) {
if (speed > i) {
diagram[i] = matrix.map(8 - (i + 1), 0, 8);
} else {
diagram[i] = 0;
}
}
matrix.drawBitmap(diagram);
speed = 0;
delay(150);
}
=== 16. Сканер дорожного полотна ===
[[https://github.com/amperka/Octoliner/archive/2.1.0.zip|Библиотека Octoliner]]
[[products:zelo-follow-line-sensor-v1|Подробное описание]] датчика линии.
#include "TroykaLedMatrix.h"
#include "Octoliner.h"
Octoliner octoliner;
TroykaLedMatrix matrix;
byte diagram[8];
void setup() {
matrix.begin();
octoliner.begin();
octoliner.setSensitivity(50);
}
void loop() {
for (int i = 0; i < 8; i++) {
int analogValue = octoliner.analogRead(i);
diagram[i] = matrix.map(analogValue, 0, 1023);
}
matrix.drawBitmap(diagram);
}
Автоматическая калибровка Октолайнера
#include "Octoliner.h"
#include "TroykaLedMatrix.h"
const byte images[][8] = {
{0x38, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x38},
{0x10, 0x30, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38},
{0x38, 0x44, 0x04, 0x04, 0x08, 0x10, 0x20, 0x7c},
{0x38, 0x44, 0x04, 0x18, 0x04, 0x04, 0x44, 0x38},
{0x04, 0x0c, 0x14, 0x24, 0x44, 0x7c, 0x04, 0x04},
{0x7c, 0x40, 0x40, 0x78, 0x04, 0x04, 0x44, 0x38},
{0x38, 0x44, 0x40, 0x78, 0x44, 0x44, 0x44, 0x38},
{0x7c, 0x04, 0x04, 0x08, 0x10, 0x20, 0x20, 0x20},
{0x38, 0x44, 0x44, 0x38, 0x44, 0x44, 0x44, 0x38},
{0x38, 0x44, 0x44, 0x44, 0x3c, 0x04, 0x44, 0x38},
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x38, 0x44, 0x44, 0x08, 0x10, 0x00, 0x10, 0x10}
};
byte result[5][8];
const int IMAGES_LEN = sizeof(images) / 8;
const int RESULT_LEN = sizeof(result) / 8;
TroykaLedMatrix matrix;
Octoliner octoliner;
byte shift = 0;
byte getX__(byte c) { return c / 100;}
byte get_X_(byte c) { return (c - floor(c / 100) * 100) / 10; }
byte get__X(byte c) { return (c - floor(c / 10) * 10); }
void copyPattern(byte position, byte value) {
for(byte i = 0; i < 8; i++) {
result[position][i] = images[value][i];
}
}
void setup() {
byte optimal;
Serial.begin(115200);
matrix.begin();
octoliner.begin();
delay(1000);
while( digitalRead(10) != 0);
matrix.drawBitmap(images[11]);
octoliner.optimizeSensitivityOnBlack();
optimal = octoliner.getSensitivity();
Serial.print(optimal);
copyPattern(0,10); copyPattern(1,10);
copyPattern(2,getX__(optimal));
copyPattern(3,get_X_(optimal));
copyPattern(4,get__X(optimal));
}
void loop() {
delay(70);
matrix.marquee(result, RESULT_LEN, shift++);
if(shift == RESULT_LEN * 8) { shift = 0; }
}
=== 17. Драг-рейсинг ===
#include "Dragster.h"
#include "TroykaLedMatrix.h"
#include "Octoliner.h"
Dragster robot(MMAX_16_OHM);
TroykaLedMatrix matrix;
Octoliner octoliner;
byte diagram[8];
void setup() {
robot.begin();
matrix.begin();
octoliner.begin();
octoliner.setSensitivity(208);
}
void loop() {
for (int i = 0; i < 8; i++) {
int adcValue = octoliner.analogRead(i);
diagram[i] = matrix.map(adcValue, 0, 1023);
if (diagram[i] < 4) {
robot.drive(0, 0);
}
}
matrix.drawBitmap(diagram);
if (robot.readButton() == 0) {
delay(1000);
robot.drive(100, 100);
}
}
=== 18. Следование по линии ===
#include "Dragster.h"
#include "TroykaLedMatrix.h"
#include "Octoliner.h"
Dragster robot(MMAX_16_OHM);
TroykaLedMatrix matrix;
Octoliner octoliner;
byte diagram[8];
float weight[] =
{ -1, -0.75, -0.5, -0.25, 0.25, 0.5, 0.75, 1};
float Kp = 2;
void setup() {
robot.begin();
matrix.begin();
octoliner.begin();
octoliner.setSensitivity(208);
}
void loop() {
float error = 0;
float sum = 0;
float sumWeighted = 0;
for (int i = 0; i < 8; i++) {
int adcValue = octoliner.analogRead(i);
diagram[i] = matrix.map(adcValue, 0, 1023);
sum += adcValue;
sumWeighted += adcValue * weight[i];
}
if (sum != 0.0) {
error = sumWeighted / sum;
}
matrix.drawBitmap(diagram);
robot.driveF(0.35 * (1 - error * Kp), 0.35 * (1 + error * Kp));
}
=== 19. Тюнинг. ПИД-регулятор ===
[[https://github.com/amperka/PID_dragster/archive/2.0.0.zip|Библиотека PID_dragster]]
#include "Dragster.h"
#include "Octoliner.h"
#include "PID_dragster.h"
Dragster robot(MMAX_16_OHM);
Octoliner octoliner;
int lineData[8];
float speed = 0.4;
float KP = 1;
double output;
PID regulator(&output, KP, 0, 0);
void setup() {
robot.begin();
octoliner.begin();
octoliner.setSensitivity(208);
}
void loop() {
for (int i = 0; i < 8; i++) {
lineData[i] = octoliner.analogRead(i);
}
double error = octoliner.trackLine(lineData);
regulator.compute(error);
robot.driveF(speed * (1 - output), speed * (1 + output));
}
=== 20. Предсказания ===
#include "Dragster.h"
#include "Octoliner.h"
#include "PID_dragster.h"
Dragster robot(MMAX_16_OHM);
Octoliner octoliner;
int lineData[8];
float speed = 0.5;
float KP = 1;
float KD = 1;
double output;
PID regulator(&output, KP, 0, KD);
void setup() {
robot.begin();
octoliner.begin();
octoliner.setSensitivity(208);
}
void loop() {
for (int i = 0; i < 8; i++) {
lineData[i] = octoliner.analogRead(i);
}
double error = octoliner.trackLine(lineData);
regulator.compute(error);
robot.driveF(speed * (1 - output), speed * (1 + output));
}
=== 21. Накопление ===
#include "Dragster.h"
#include "Octoliner.h"
#include "PID_dragster.h"
Dragster robot(MMAX_16_OHM);
Octoliner octoliner;
int lineData[8];
float speed = 0.55;
float KP = 0.5;
float KD = 0.5;
float KI = 0.0;
double output;
PID regulator(&output, KP, KI, KD);
void setup() {
robot.begin();
octoliner.begin();
octoliner.setSensitivity(208);
}
void loop() {
for (int i = 0; i < 8; i++) {
lineData[i] = octoliner.analogRead(i);
}
double error = octoliner.mapLine(lineData);
regulator.compute(error);
robot.driveF(speed * (1 - output), speed * (1 + output));
}
===== Расширенный набор «Драгстер» =====
{{ :dragster-a1:dragster.school.png?nolink&600 |}}
==== Исходники ====
=== 1 ===
#include "Dragster.h"
Dragster robot(MMAX_16_OHM);
void setup() {
robot.begin();
}
void loop() {
float speed = analogRead(A11) / 1023.0;
robot.driveF(speed, speed);
}
=== 2 ===
#include "Dragster.h"
#include "Octoliner.h"
#include "PID_dragster.h"
Dragster robot(MMAX_16_OHM);
Octoliner octoliner;
int lineData[8];
double output;
PID regulator(&output, 0.0, 0.0, 0.0);
void setup() {
robot.begin();
octoliner.begin();
octoliner.setSensitivity(208);
}
void loop() {
float kp = analogRead(A4) / 1023.0 * 1.0;
float kd = analogRead(A5) / 1023.0 * 0.2;
float speed = analogRead(A11) / 1023.0 * 1.0;
regulator.SetTunings(kp, 0, kd);
for (int i = 0; i < 8; i++) {
lineData[i] = octoliner.analogRead(i);
}
float difference = octoliner.mapLine(lineData);
regulator.compute(difference);
robot.driveF(speed - output, speed + output);
}
=== 3 ===
#include "Dragster.h"
#include "Octoliner.h"
#include "PID_dragster.h"
#include "TroykaLedMatrix.h"
Dragster robot(MMAX_16_OHM);
Octoliner octoliner;
int lineData[8];
TroykaLedMatrix matrix;
byte diagram[8];
byte sensitivity;
float speed = 0.2;
double output;
PID regulator(&output, 0.5, 0, 0.02);
void setup() {
robot.begin();
octoliner.begin();
octoliner.setSensitivity(208);
matrix.begin();
Serial.begin(115200);
}
void loop() {
octoliner.setSensitivity(sensitivity = analogRead(A4) / 4);
for (int i = 0; i < 8; i++) {
lineData[i] = 4095 - octoliner.analogRead(i);
diagram[i] = matrix.map(lineData[i], 3072, 4095);
}
matrix.drawBitmap(diagram);
regulator.compute(octoliner.mapLine(lineData));
robot.driveF(speed - output, speed + output);
Serial.println(sensitivity);
}
=== 4 ===
#include "Dragster.h"
#include "Octoliner.h"
#include "PID_dragster.h"
#include "TroykaLedMatrix.h"
Dragster robot(MMAX_16_OHM);
Octoliner octoliner;
int lineData[8];
TroykaLedMatrix matrix;
byte diagram[8];
float speed = 0.2;
double output;
PID regulator(&output, 0.3, 0, 0.01);
void setup() {
robot.begin();
octoliner.begin();
octoliner.setSensitivity(208);
matrix.begin();
}
void loop() {
int sum = 0;
for (int i = 0; i < 8; i++) {
lineData[i] = octoliner.analogRead(i);
sum += lineData[i];
diagram[i] = matrix.map(lineData[i], 0, 1023);
}
matrix.drawBitmap(diagram);
if (sum > 2047 * 8) {
for (int i = 0; i < 8; i++) {
lineData[i] = 4095 - lineData[i];
}
}
float error = octoliner.mapLine(lineData);
regulator.compute(error);
robot.driveF(speed - output, speed + output);
}
=== 5 ===
#include "Dragster.h"
#include "Octoliner.h"
#include "PID_dragster.h"
Dragster robot(MMAX_16_OHM);
Octoliner octoliner;
int lineData[8];
float speed = 0.35;
float kp = 0.35;
float kd = 0.05;
double output;
PID regulator(&output, kp, 0, kd);
void setup() {
robot.begin();
octoliner.begin();
octoliner.setSensitivity(208);
while (digitalRead(11) == 1) {
delay(10);
}
}
void loop() {
for (int i = 0; i < 8; i++) {
lineData[i] = octoliner.analogRead(i);
}
double difference = octoliner.mapLine(lineData);
regulator.compute(difference);
robot.driveF(speed - output, speed + output);
}
=== 6 ===
#define TRIGPIN 8
#define ECHOPIN 9
void setup() {
pinMode(TRIGPIN, OUTPUT);
pinMode(ECHOPIN, INPUT);
Serial.begin(115200);
}
void loop() {
digitalWrite(TRIGPIN, HIGH);
delayMicroseconds(5);
digitalWrite(TRIGPIN, LOW);
unsigned long duration = pulseIn(ECHOPIN, HIGH);
float distance = 0.345 * duration / 2;
Serial.print(distance);
Serial.println("mm");
delay(100);
}
=== 7 ===
#include "Dragster.h"
#include "PID_dragster.h"
#define TRIGPIN 8
#define ECHOPIN 9
Dragster robot(MMAX_16_OHM);
double output;
PID regulator(&output, 0.5, 0.1, 0.02);
void setup() {
pinMode(TRIGPIN, OUTPUT);
pinMode(ECHOPIN, INPUT);
robot.begin();
regulator.setOutputLimits(-0.2, 0.2);
}
void loop() {
digitalWrite(TRIGPIN, HIGH);
delayMicroseconds(5);
digitalWrite(TRIGPIN, LOW);
long duration = pulseIn(ECHOPIN, HIGH, 1800);
if (duration == 0) {
robot.driveF(0, 0);
} else {
double distance = 0.34 * duration / 2.0;
double difference = (100 - distance) / 100.0;
regulator.compute(difference);
robot.driveF(output, output);
}
}
=== 8 ===
[[https://github.com/amperka/TroykaOLED/archive/2.0.2.zip|Библиотека TroykaOLED]]
#include "TroykaOLED.h"
TroykaOLED display;
void setup() {
display.begin();
}
void loop() {
display.setFont(digits24x40);
for (int i = 5; i > 0; i--) {
display.clearDisplay();
display.print(i, OLED_CENTER, OLED_CENTER);
delay(1000);
}
display.clearDisplay();
display.setFont(alfabet12x16);
display.print("Hi, racer!", OLED_CENTER, OLED_CENTER);
delay(2000);
}
=== 9 ===
#include "TroykaOLED.h"
TroykaOLED display;
char text[] = "Amperka racing";
int length = strlen(text);
int symbolWidth = 12;
int width = symbolWidth * length;
void setup() {
display.begin();
display.setFont(alfabet12x16);
display.autoUpdate(false);
}
void loop() {
for (int x = 127; x > -width; x--) {
display.clearDisplay();
display.print(text, x, OLED_CENTER);
display.update();
}
}
=== 10 ===
#include "TroykaOLED.h"
TroykaOLED display;
const byte PROGMEM logo[] = {
11, 16,
0x88, 0x50, 0x20, 0x8e, 0x51, 0x51, 0x51, 0x8e, 0x20, 0x50, 0x88,
0x0f, 0x10, 0x27, 0x48, 0x50, 0x50, 0x50, 0x48, 0x27, 0x10, 0x0f
};
int position = 60;
int direction = 1;
void setup() {
display.begin();
display.autoUpdate(false);
}
void loop() {
display.clearDisplay();
display.drawImage(logo, position, OLED_CENTER);
display.update();
position += direction;
if ((position > 115) || (position < 3)) {// 7
direction *= -1; //
}
}
=== 11 ===
[[https://github.com/amperka/TroykaColorSensor/archive/1.0.0.zip|Библиотека TroykaColorSensor]]
#include "TroykaColorSensor.h"
TroykaColorSensor colorSensor;
void setup() {
colorSensor.begin();
Serial.begin(115200);
}
void loop() {
analogWrite(13, analogRead(A5) / 4);
RGB color = colorSensor.colorRead();
Serial.print(color.red);
Serial.print('\t');
Serial.print(color.green);
Serial.print('\t');
Serial.println(color.blue);
delay(100);
}
=== 12 ===
#include "TroykaColorSensor.h"
TroykaColorSensor colorSensor;
void printColor(RGB c) {
if ((c.red > c.green) && (c.red > c.blue))
Serial.println("RED");
if ((c.green > c.red) && (c.green > c.blue))
Serial.println("GREEN");
if ((c.blue > c.green) && (c.blue > c.red))
Serial.println("BLUE");
}
void setup() {
colorSensor.begin();
Serial.begin(115200);
}
void loop() {
analogWrite(13, analogRead(A5) / 4);
RGB color = colorSensor.colorRead();
printColor(color);
delay(100);
}
=== 13 ===
#include "TroykaColorSensor.h"
typedef enum {
RED = 0, GREEN = 1, BLUE = 2, OTHER = 3
} ColorComponent;
TroykaColorSensor colorSensor;
int colors[4] = { 0, 0, 0, 0 };
int totalCount = 0;
int colorIs(RGB c) {
if ((c.red > c.green) && (c.red > c.blue)) return RED;
else if ((c.green > c.red) && (c.green > c.blue)) return GREEN;
else if ((c.blue > c.green) && (c.blue > c.red)) return BLUE;
else return OTHER;
}
void setup() {
colorSensor.begin();
Serial.begin(115200);
}
void loop() {
analogWrite(13, analogRead(A5) / 4);
if (digitalRead(10) == 0) {
totalCount++;
ColorComponent answer = colorIs(colorSensor.colorRead());
colors[answer] += 1;
Serial.println(totalCount);
delay(500);
}
if (totalCount == 10) {
Serial.print("Red: ");
Serial.println(colors[RED]);
Serial.print("Green: ");
Serial.println(colors[GREEN]);
Serial.print("Blue: ");
Serial.println(colors[BLUE]);
Serial.print("Other: ");
Serial.println(colors[OTHER]);
totalCount = 0;
colors[0] = colors[1] = colors[2] = colors[3] = 0;
}
}
=== 14 ===
#include "TroykaOLED.h"
#include "TroykaColorSensor.h"
typedef enum {
RED = 0, GREEN = 1, BLUE = 2, OTHER = 3
} ColorComponent;
TroykaColorSensor colorSensor;
int colors[4] = { 0, 0, 0, 0 };
int totalCount = 0;
TroykaOLED display;
int colorIs(RGB c) {
if ((c.red > c.green) && (c.red > c.blue)) return RED;
else if ((c.green > c.red) && (c.green > c.blue)) return GREEN;
else if ((c.blue > c.green) && (c.blue > c.red)) return BLUE;
else return OTHER;
}
void setup() {
colorSensor.begin();
display.begin();
display.clearDisplay();
}
void loop() {
analogWrite(13, analogRead(A5) / 4);
if (digitalRead(10) == 0) {
totalCount++;
ColorComponent answer = colorIs(colorSensor.colorRead());
colors[answer] += 1;
display.setFont(alfabet12x16);
display.clearDisplay();
display.print(totalCount, OLED_CENTER, OLED_CENTER);
delay(500);
}
if (totalCount == 10) {
display.clearDisplay();
display.setFont(alfabet6x8);
display.print("Red: ", 0, 0); display.print(colors[RED],40, 0);
display.print("Green: ", 0, 10); display.print(colors[GREEN], 40, 10);
display.print("Blue: ", 0, 20); display.print(colors[BLUE], 40, 20);
display.print("Other: ", 0, 30); display.print(colors[OTHER], 40, 30);
totalCount = 0;
colors[0] = colors[1] = colors[2] = colors[3] = 0;
delay(5000);
}
}
=== 15 ===
#include "TroykaLedMatrix.h"
int left, right;
TroykaLedMatrix matrix;
byte diagram[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
void setup() {
matrix.begin();
Serial.begin(115200);
}
void loop() {
right = analogRead(A0);
left = analogRead(A3);
diagram[0] = matrix.map(right, 0, 1023);
diagram[7] = matrix.map(left, 0, 1023);
Serial.print(right);
Serial.print("\t");
Serial.println(left);
matrix.drawBitmap(diagram);
delay(200);
}
=== 16 ===
#include "Dragster.h"
#include "PID_dragster.h"
#include "TroykaLedMatrix.h"
int left, right;
Dragster robot(MMAX_16_OHM);
TroykaLedMatrix matrix;
byte diagram[8];
float kp = 0.3;
float kd = 0.06;
float speed = 0.25;
double output;
PID regulator(&output, kp, 0.02, kd);
void setup() {
robot.begin();
matrix.begin();
}
void loop() {
right = analogRead(A0);
diagram[0] = matrix.map(right, 0, 1023);
left = analogRead(A3);
diagram[7] = matrix.map(left, 0, 1023);
matrix.drawBitmap(diagram);
float difference = (right - left) / 1023.0;
regulator.compute(difference);
robot.driveF(speed - output, speed + output);
}
=== 17 ===
#include "Servo.h"
Servo servo;
void setup() {
servo.attach(9);
}
void loop() {
int value = analogRead(A5);
int angle = map(value, 0, 1023, 0, 180);
servo.write(angle);
delay(15);
}
=== 21 ===
#include "Servo.h"
#define BUTTONPIN 9
#define SERVOPIN 6
#define OPENED 160
#define CLOSED 100
Servo barrier;
int state = OPENED;
void setup() {
barrier.attach(SERVOPIN);
barrier.write(state);
}
void loop() {
if (digitalRead(BUTTONPIN) == 0) {
delay(100);
if (digitalRead(BUTTONPIN) == 0) {
for (int i = state;
(state == OPENED) ? i >= CLOSED : i <= OPENED;
(state == OPENED) ? i-- : i++) {
barrier.write(i);
delay(15);
}
state = (state == OPENED) ? CLOSED : OPENED;
}
}
}
=== 22 ===
[[https://github.com/amperka/TroykaProximity/archive/1.0.0.zip|Библиотека TroykaProximity]]
#include "TroykaProximity.h"
TroykaProximity sensor;
void setup() {
sensor.begin();
Serial.begin(115200);
}
void loop() {
int range = sensor.readRange();
if (range == 255) {
Serial.println("Out of range");
}
else {
Serial.println(range);
}
delay(200);
}
=== 23 ===
[[https://github.com/amperka/QuadDisplay2/archive/1.0.0.zip|Библиотека QuadDisplay2]]
#include "QuadDisplay2.h"
#include "TroykaProximity.h"
#define DISTANCE 130
TroykaProximity proximity;
QuadDisplay quad(6);
long startTime = 0;
void setup() {
quad.begin();
proximity.begin();
}
void loop() {
if (proximity.readRange() < DISTANCE) {
startTime = millis();
delay(2000);
}
float lapTime = millis() - startTime;
quad.displayFloat(lapTime / 1000.0, 2);
}
=== 24 ===
#define INFRAREDPIN 5
#define REDPIN 6
#define YELLOWPIN 7
#define GREENPIN 9
void light(byte pin, int ms) {
digitalWrite(pin, HIGH);
delay(ms);
digitalWrite(pin, LOW);
}
void light(byte pin1, byte pin2, int ms) {
digitalWrite(pin1, HIGH);
digitalWrite(pin2, HIGH);
delay(ms);
digitalWrite(pin1, LOW);
digitalWrite(pin2, LOW);
}
void blinked(byte pin, int ms) {
for (byte i = 0; i < 4; i++) {
light(pin, ms);
delay(ms);
}
}
void setup() {
pinMode(INFRAREDPIN, OUTPUT);
pinMode(REDPIN, OUTPUT);
pinMode(YELLOWPIN, OUTPUT);
pinMode(GREENPIN, OUTPUT);
}
void loop() {
light(REDPIN, 4000);
light(REDPIN, YELLOWPIN, 2000);
noTone(INFRAREDPIN);
light(GREENPIN, 2000);
blinked(GREENPIN, 250);
tone(INFRAREDPIN, 38000);
light(YELLOWPIN, 3000);
}