Návod
na výrobu RC auta s funkcí měření sklonu povrchu
POTŘEBY - mechanická část
- pevný karton nebo tenká dřevěná nebo plastová deska
- 6× lékařské lopatky (dřevěné špachtle) o rozměrech 150 mm × 17 mm × 1,6 mm
- kousek dřevěné tyčky, průměr 5 mm
- šroubky - 4× M3
- matice - 4× M3
- 2× vrut
- kousek pevnější plastové folie
- pevná kancelářská sponka
- 4× 2 cm bužírky
POTŘEBY - elektronická část a Arduino
- 2× deska Arduino NANO nebo klon Arduino NANO CH340
- 2× modul nRF24L01+
- L298N motor driver
- servo TOWERPRO SG-90
- 2× kola v balení s převodovanými motory
- 2× kola
- 4× tlačítka 6x6x12 mm
- 4× hmatník na tlačítka
- 3× 9V baterie
- 3× bateriový box s On-Off přepínačem
- kabely samec-samec, samec-samice
- 5× nepájivé pole 170 bodů
- modul MPU6050
- LCD display 1602 s I²C převodníkem
POMŮCKY
- vrtačka
- šablony
- lepidlo
- nůž
- nůžky
- lepící páska
PŘÍPRAVA
- Připájíme piny na modul MPU6050, pokud ještě připájené nejsou
- Připájíme k motorům vodiče, pokud ještě připájené nejsou
- U předních kol provrtáme otvor uprostřed skrz a dokulata
- Jelikož vodiče u bateriových boxů příliš nedrží na nepájivých polích, je třeba si rozstřihnout dva vodiče samec-samec na půl, vzít si jednu z ustřižených částí a jeden vodič bateriového boxu, odstranit z jejích částí plast na povrchu, zamotat je do sebe, podle návodu, navléct na ně bužírku a tu nechat nad zapalovačem se nad nimi stáhnout.
- Na točící se část serva dáme součástku s jednou lopatkou tak, aby po poslání programu kdy má být v bodě 90°, byla kolmo k servu, jako na obrázku. Pokud to tak není, necháme servo napsat pozici 90° (jednoduše nic nemačkáme), a následně lopatku umístíme do vyžadované pozice.

POSTUP SESTAVENÍ ELEKTRONICKÉ ČÁSTI
Během nahrávání programu do Arduina, k němu nepřipojujeme baterie. Baterii připojíme pouze k modulu L298N, červený vodič na +12V, černý na GND, kam už je připojeno i GND Arduina. Jakmile jsou programy v Arduinech nahrány a vše funguje jak má, odpojíme Arduino z počítače a připojíme k němu baterii, červený vodič na pin VIN a černý na GND.
Ovladač
Umístěme tlačítka a Arduino na nepájivá pole jako na obrázku, následně vše propojíme pomocí kabelů a to takto:
Tlačítka
- Arduino pin D2 - horní tlačítko
- Arduino pin D3 - dolní tlačítko
- Arduino pin D4 - levé tlačítko
- Arduino pin D5 - pravé tlačítko
- k pinu, který se nachází na tlačítku diagonálně s pinem, ke kterému jsme připojili D2, D3, D4 nebo D5, připojíme pin GND na Arduinu, to uděláme u všech tlačítek (viz obrázek)
Displej
- Arduino pin A4 - SDA
- Arduino pin A5 - SCL
- GND displeje připojíme ke stejnému GND, jako jsme připojili tlačítka
- VCC displeji připojíte na 5V Arduina
nRF24L01
- Arduino pin D7 - CE
- Arduino pin D8 - CS
- Arduino pin D11 - MOSI
- Arduino pin D12 - MISO
- Arduino pin D13 - SCK
- GND modulu opět spojit s GND z tlačítek a displeje
- VCC modulu připojit na 3V3 Arduina

Tip: Na nepájivých polích je vždy spojeno 5 pinů (viz obrázek), pokud tedy nemáte vedle Arduina dost místa pro všechna GND, stačí GND Arduina zapojit do řady, ve které nic není a následně připojovat další zařízení.

Auto
Umístíme Arduino a modul MPU na nepájivá pole jako na obrázku, následně vše propojíme pomocí kabelů:
nRF24L01
- Arduino pin D7 - CE
- Arduino pin D8 - CS
- Arduino pin D11 - MOSI
- Arduino pin D12 - MISO
- Arduino pin D13 - SCK
- GND modulu spojit s GND Arduina
- VCC modulu připojit na 3V3 Arduina
servo
- Arduino pin D9 - oranžový nebo žlutý vodič
- černý vodič serva připojit na GND Arduina, kam už je připojen modul nRF
- červený vodič serva připojit na 5V Arduina
MPU-6050
- Arduino pin D2 - INT
- Arduino pin A4 - SDA
- Arduino pin A5 - SCL
- GND modulu připojit na GND Arduina
- VCC modulu připojit na 5V Arduina
L298N
- Arduino pin D3 - IN4
- Arduino pin D4 - IN3
- Arduino pin D5 - IN2
- Arduino pin D6 - IN1
- GND modulu spojit s GND Arduina
motory
- k motorům připájené vodič napojit na OUT1, OUT2, OUT3, OUT4
Tip: Pokud se po nahrání programu jeden z motorů točí špatným směrem přepojte vodiče, např. vodič jednoho motoru byl na OUT1, druhý na OUT2, po přepojení je první vodič na OUT2 a druhý na OUT1.

PROGRAMOVÁNÍ
Aby programy fungovaly, je nutné si stáhnout některé knihovny a uložit je do složka Arduino - libraries na vašem počítači. Potřebné jsou tyto knihovny:
Ovladač
#include <LiquidCrystal_I2C.h>
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
int button1 = 2;
int button2 = 3;
int button3 = 4;
int button4 = 5;
typedef struct { // struktura paketu pro odeslání
boolean button_state1 = 0;
boolean button_state2 = 0;
boolean button_state3 = 0;
boolean button_state4 = 0;
}
dataPacket;
RF24 radio(7, 8);
const byte addresses[6] ={"00001"};
float ackData;
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
Serial.begin(38400);
radio.begin();
radio.openWritingPipe(addresses[1]);
radio.enableAckPayload();
radio.setPALevel(RF24_PA_MIN);
radio.stopListening();
pinMode(button1, INPUT_PULLUP);
pinMode(button2, INPUT_PULLUP);
pinMode(button3, INPUT_PULLUP);
pinMode(button4, INPUT_PULLUP);
lcd.begin(); // initialize the lcd
lcd.backlight();
lcd.setBacklight(HIGH);
}
void loop () {
dataPacket packet;
packet.button_state1 = digitalRead(button1);
packet.button_state2 = digitalRead(button2);
packet.button_state3 = digitalRead(button3);
packet.button_state4 = digitalRead(button4);
radio.write(&packet, sizeof(dataPacket));
delay(5);
if ( radio.isAckPayloadAvailable() ) {
radio.read(&ackData, sizeof(ackData));
}
Serial.print(ackData);
lcd.setCursor(0, 0);
lcd.print("sklon: ");
lcd.print(ackData);
delay(1000);
}
Auto
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h>
#include "Wire.h"
#include "Math.h"
#include "I2Cdev.h"
#include "MPU6050.h"
RF24 radio(7, 8); //NRF
const byte addresses[6] = {"00001"};
typedef struct { // struktura paketu pro odeslání
boolean button_state1 = 0;
boolean button_state2 = 0;
boolean button_state3 = 0;
boolean button_state4 = 0;
}
dataPacket;
int in1 = 3; //L298N
int in2 = 4;
int in3 = 5; //L298N
int in4 = 6;
int pos = 0;
Servo servo;
MPU6050 accelerometer; //MPU
const float pi = 3.141592;
const int pocet_vzorku = 100;
int16_t ax, ay, az;
float x, y, z;
float _angle_y, angle_y;
long ax_p, ay_p, az_p;
float ackData;
void setup() {
Serial.begin(115200);
radio.begin();
//radio.openWritingPipe(addresses[0]); //00001
radio.openReadingPipe(1, addresses[1]); //00002
radio.enableAckPayload();
radio.setPALevel(RF24_PA_MIN);
radio.startListening();
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
servo.attach(9);
servo.write (90);
Wire.begin();
accelerometer.initialize();
if (accelerometer.testConnection());
Serial.println("Spojeni OK...");
}
void loop() {
for ( int pocet = 1; pocet <= pocet_vzorku; pocet++) {
accelerometer.getAcceleration(&ax, &ay, &az);
ax_p = ax_p + ax;
ay_p = ay_p + ay;
az_p = az_p + az;
}
//prumer
x = ax_p / pocet_vzorku;
y = ay_p / pocet_vzorku;
z = az_p / pocet_vzorku;
//sklon
angle_y = atan2(y, sqrt(square(x) + square(z)) ) / (pi / 180);
ackData = angle_y-2; /* nejdříve zkuste bez odečítání nebo přičítání čehokoliv a podle toho,
jestli bude displej na rovině ukazovat nulu přičtěte nebo odečtěte potřebné číslo*/
delay(5);
dataPacket packet;
if (radio.available()) {
radio.read(&packet, sizeof(dataPacket));
Serial.println(packet.button_state1);
if (packet.button_state1 == LOW ) {
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
}
else if (packet.button_state2 == LOW) {
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
}
else {
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
if (packet.button_state3 == LOW) { //případně místo 75 a 105 zvolte jiné hodnoty, ty by ale měly mít od 90 vždy stejnou vzdálenost
servo.write(75);
}
else if (packet.button_state4 == LOW) {
servo.write(105);
}
else {
servo.write(90);
}
}
delay(5);
radio.writeAckPayload(1, &ackData, sizeof(ackData));
ax_p = 0;
ay_p = 0;
az_p = 0;
}
POSTUP SESTAVENÍ MECHANICKÉ ČÁSTI
Podle šablony si z kartonu nebo podobného materiálu vytvoříme podvozek a spodní část ovládání. Z dřevěných špachtlí vyrobíme podle šablon potřebné díly řízení. Následně slepíme ty, které patří na sebe. Potom vyvrtáme otvory tam, kde jsou potřeba. (Otvory jsou vyznačené na šablonách a všechny mají průměr 3 mm, pokud není uvedeno jinak.)
Tip: Detailnější popis naleznete níže.
Popis sestavení mechanické části:
Šablony:
ovladač - horní část
ovladač - prostřední a spodní část
podvozek - otvory v podvozku
podvozek - sestavení
řízení - díly
řízení - sestavení