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:

I2C dev

LiquidCrystal-I2C

MPU6050

RF24


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í

Vytvořte si webové stránky zdarma! Tento web je vytvořený pomocí Webnode. Vytvořte si vlastní stránky zdarma ještě dnes! Vytvořit stránky