KS0551 Keyestudio 4WD Mecanum Robot For Arduino
KS0551 Keyestudio 4WD Mecanum Robot For Arduino
*About keyestudio
smart cars, which can help customers at any level to learn Arduino
http://www.keyestudio.com
1. Download address:https://fs.keyestudio.com/KS0551
difficulty learning the kit, please feel free to contact us. Welcome to
*Warning
*Copyright
The keyestudio trademark and logo are the copyright of KEYES DIY
representatives: [email protected]
2
www.keyestudio.com
keyestudio
1. Description
KEYES group rolls out a 4WD Mecanum Robot kit to cope with this
problem. This product not only allows your child to learn the
3
www.keyestudio.com
keyestudio
t. In fact, it is also simple to install and connect from complex
which solely need a few simple assembly steps to build your own
module,etc.
There are 12 programming courses in this kit, which rang from simple
to complex. If this can not meet your demand, you can seek to
2. Features
avoidance, 4WD drive, car tracking, UNO PLUS control board, etc.
2. Easy to build: Motor drive , RGB2812 and 7-color LEDs have been
3. Novel style: We use the Mecanum wheels and the wirings between
4
www.keyestudio.com
keyestudio
modules are simple.
can extend other sensors and modules. What’s more, the Matrix
3. Parameters
Input voltage:7-12V
Working voltage:5V
4. Kit
MD0487
1 Acrylic Board 1
T=3mm
5
www.keyestudio.com
keyestudio
Motor Plate
3 4
4 4.5V Motor 4
5 23*15*5mm Fixing 4
Board
DX-BT24 Bluetooth
6 1
Module
7 Servo 1
8 Mecanum Wheels 4
6
www.keyestudio.com
keyestudio
9 Keyestudio Sensor 1
Keyestudio UNO
10 1
PLUS
Keyestudio 4WD
Mecanum Robot
11 1
Lower Board
M3*15MM Dual-pass
12 4
Copper Pillar
13 4
4265c Lego Part
7
www.keyestudio.com
keyestudio
14 4
43093 Lego Part
HC-SR04 Ultrasonic
17 1
Sensor
M3 Nickle-plated
19 10
Nut
8
www.keyestudio.com
keyestudio
M3*30mm Round
20 9
Head Screw
M2 Nickle-plated
21 3
Nut
M2*8mm Round
22 3
Head Screw
M1.4 Nickle-plated
23 6
Nut
M1.4*10mm Round
24 6
Head Screw
M2.3*16mm Round
25 4
Head Screw
Remote Control
26 1
(without batteries)
Plastic String
27 5
3*100mm
9
www.keyestudio.com
keyestudio
28 USB Cable 1
HX-2.54 2P DuPont
29 1
Wire 100mm
HX-2.54 5P DuPont
30 1
Wire 100mm
31 HX-2.54 4P DuPont 2
Wire 50mm
HX2.54mm-4P to
150mm
XH2.54 3P DuPont
33 3
Wire 50mm
34 3*40mm Screwdriver 1
10
www.keyestudio.com
keyestudio
35 TT Coupling 4
M1.2*5mm Round
36 Head Self-tapping 6
Screw
Microcontroller ATMEGA328P-AU
Operating Voltage 5V
6 个 (D3,D5,D6,D9,D10,
PWM Digital I/O Pins
D11)
32 KB (ATMEGA328P-PU) of
bootloader
SRAM 2 KB (ATMEGA328P-PU)
EEPROM 1 KB (ATMEGA328P-PU)
12
www.keyestudio.com
keyestudio
13
www.keyestudio.com
keyestudio
driver firstly.
You can download either Windows win7 and newer or Windows ZIP
file.
There are two versions of IDE for WINDOWS system, you can choose
from the Installer (.exe) and the Zip packages. We suggest you use
the first one that installs directly everything you need to use the
With the Zip package you need to install the drivers manually. The Zip
15
www.keyestudio.com
keyestudio
16
www.keyestudio.com
keyestudio
We will work to install the Keyes Uno Plus development board driver,
software 1.8 or above has included the driver of this chip, thereby, it is
17
www.keyestudio.com
keyestudio
18
www.keyestudio.com
keyestudio
19
www.keyestudio.com
keyestudio
Open the DIRVERS file to see the driver of the CP210X series chips
20
www.keyestudio.com
keyestudio
21
www.keyestudio.com
keyestudio
22
www.keyestudio.com
keyestudio
(4)Interfaces for the expansion board:
The interface of motors, 7 color LEDs and RGB on the car are drawn
out, we solely need a wire with anti-reverse plug terminal from the
(5)Driver Board
bottom board, and they share a signal pin (the 7-color LED also share
23
www.keyestudio.com
keyestudio
a signal pin), which is convenient to receive the infrared data we send
24
www.keyestudio.com
keyestudio
To avoid the errors when uploading the program to the board, you
need to select the correct Arduino board that matches the board
25
www.keyestudio.com
keyestudio
Then select the correct COM port (you can see the corresponding
26
www.keyestudio.com
keyestudio
27
www.keyestudio.com
keyestudio
F- Used to send the serial data received from board to the serial
monitor.
We learned how to download the software and install the driver for
Test Code
void setup() {
Serial.begin(9600);
void loop() {
Serial.println("Hello world!");
29
www.keyestudio.com
keyestudio
30
www.keyestudio.com
keyestudio
Click to start compiling the program, and check errors.
Upload the program successfully, open the serial monitor and set
31
www.keyestudio.com
keyestudio
32
www.keyestudio.com
keyestudio
6. The Installation of Keyestudio 4WD Mecanum Robot Car
Part 1
Components
Needed
Installation
Diagram
33
www.keyestudio.com
keyestudio
Prototype
Part 2
Components
Needed
34
www.keyestudio.com
keyestudio
Installation
Diagram
Prototype
35
www.keyestudio.com
keyestudio
Part 3
Components
Needed
36
www.keyestudio.com
keyestudio
Installation
Diagram
Prototype
37
www.keyestudio.com
keyestudio
#include <Servo.h>
Servo myservo; //Define a servo
Adjust the
degrees
myservo.write(90); //Return to the 90 degree position
according to
the right
delay(500);
picture
}
void loop() {
Components
Needed
38
www.keyestudio.com
keyestudio
Installation
Diagram
(mind the
installation
direction)
Prototype
39
www.keyestudio.com
keyestudio
Part 5
Components
Needed
Installation
Diagram
40
www.keyestudio.com
keyestudio
Prototype
Part 6
Components
Needed
41
www.keyestudio.com
keyestudio
Installation
Diagram
Prototype
42
www.keyestudio.com
keyestudio
Part 7
Components
Needed
Installation
Diagram
(mind the
direction of
the motor)
43
www.keyestudio.com
keyestudio
Prototype
44
www.keyestudio.com
keyestudio
Part 8
Components
Needed
Installation
Diagram
(Pay
attention to
the
installation
direction of
the
45
www.keyestudio.com
keyestudio
mecanum
wheel)
Prototype
46
www.keyestudio.com
keyestudio
Part 9
Components
Needed
47
www.keyestudio.com
keyestudio
Installation
Diagram
Prototype
48
www.keyestudio.com
keyestudio
Part 10
Components
Needed
Installation
Diagram
49
www.keyestudio.com
keyestudio
Prototype
Inserting a
Bluetooth m
odule correc
tly
50
www.keyestudio.com
keyestudio
Wiring Diagram
The
wiring
of the
ultrason
ic
module
(ECHO pin is
connected to
13,TRIG pin is
connected to
12)
51
www.keyestudio.com
keyestudio
The
wiring
of the
servo
(The servo pin
is connected to
9)
The
wiring
of the
power
(Power
must be
plugged into
the 5V
terminal)
52
www.keyestudio.com
keyestudio
The
wiring
of the IR
receivin
g sensor
(The pin of the
IR receiving
sensor is
connected to
A4)
53
www.keyestudio.com
keyestudio
The
wiring
of the
RGB
2812
LED(The pin
of the 2812 LED
is connected to
10)
54
www.keyestudio.com
keyestudio
The
wiring
of the
7-color
LED (The
pin of the
7-color LED is
connected to
A3)
55
www.keyestudio.com
keyestudio
The
wiring
of the
M3、M4
motor
(D6D7D8D11)
The
wiring
of the
M1、M2
motor
(D2D3D4D5)
56
www.keyestudio.com
keyestudio
The
wiring
of the
line-trac
king
sensor(T
he pin of the
line-tracking
sensor is
connected to
A0A1A2)
57
www.keyestudio.com
keyestudio
Connect th
e motor to
the corres
ponding in
terface as
shown in t
he figure
Installati
on of ba
tteries
58
www.keyestudio.com
keyestudio
7.Projects
complete the projects step by step. Then we will finally combine all
Note: (G), marked on each sensor and module, is negative pole and
connected to“G”
“-”
, or“GND”on the sensor shield or control board ;
(1) Description
59
www.keyestudio.com
keyestudio
7-color LEDs, which are components with a white appearance and
displays seven colors. This module is the same as the normal LED
driver, which will automatically flash seven colors when we input high
We have integrated 7-color LEDs into our motor drive board. In the
first project, we will use a basic test code to control it to blink for 3
You can also change the time of the LEDs on and off in your code to
and VCC, the LEDs will be on if S end is high level; otherwise, it will go
off.
automatically
60
www.keyestudio.com
keyestudio
Driver Control: Each of the two 7-color LEDs uses an NPN triode
driver. The control end is connected to the network "LED S1", which is
to this pin, both triodes will turn on, and there will be voltage at both
ends of the 7-color LEDs and they will flash. On the contrary, when we
use Arduino to output low level (0V) to this pin, both triodes turn off.
At this time, there is no voltage at both ends of the two 7-color LEDs,
thereby no flicker.
(The signal ends of the two 7-colored LEDs are connected to the A3
void setup() {
pinMode(LED, OUTPUT);// Configure 7-color LED pin mode for output
}
void loop() {
digitalWrite(LED, HIGH);// Turn on the 7-color LED flash
delay(5000); // Delay 5000 ms
}
//*******************************************************************
Click upload the program and you will see the 7-color LEDs flash for 5
INPUT or OUTPUT.
62
www.keyestudio.com
keyestudio
Project 2: WS2812 RGB
(1) Description
light emitting circuit. The appearance of each LED is the same as that
of a 5050 LED and each component is a pixel. There are four LEDs on
our motor drive board, namely four pixels. Let's learn how to control
it to display color.
Working voltage:DC 5V
Pin number:3(VCC,GND,S)
Driver Control: The four pixel LEDs are connected in series, and we
can control any one of the LEDs with a pin and make it display any
63
www.keyestudio.com
keyestudio
color. The pixel contains an intelligent digital interface data locking
pixel light.
return to zero code. After the pixel is powered on and reseted, the S
When the first 24bit data extracted by the first pixel, which will be
sent to the data latch inside the pixel. This 6812RGB communication
64
www.keyestudio.com
keyestudio
R G B R G B R G B
0 0 0 255 255 0 176 224 230
41 36 33 227 207 87 65 105 225
192 192 192 255 153 18 106 90 205
128 138 135 235 124 85 135 206 235
112 128 105 255 227 132
128 128 105 255 215 0 0 255 255
218 165 105 56 94 15
255 255 255 227 168 105 8 46 84
250 235 215 255 97 0 127 255 212
240 255 255 255 97 3 64 224 208
245 245 245 237 145 33 0 255 0
255 235 205 255 128 0 127 255 0
255 248 220 245 222 179 61 145 64
252 230 201 0 201 87
255 250 240 128 24 24 34 139 34
220 220 220 163 148 128 124 252 0
248 248 255 138 54 15 50 205 50
240 255 240 135 51 36 189 252 201
250 255 240 210 105 30 107 124 35
250 240 230 255 125 64 48 128 20
255 222 173 240 230 140 46 139 87
253 245 230 188 143 143 0 255 127
255 245 238 199 97 20
255 250 250 115 74 18 160 32 240
94 38 18 138 43 226
255 0 0 160 82 45 160 102 211
156 102 31 139 69 19 153 51 250
227 23 13 244 164 96 218 112 214
255 127 80 210 180 140 221 160 221
178 34 34
176 23 31 0 0 255
176 48 96 61 89 171
135 38 87 11 23 70
250 128 114 3 168 158
255 99 71 25 25 112
65
www.keyestudio.com
keyestudio
255 69 0 51 161 201
255 0 255 0 199 140
//Create a category named rgb_2812 to control 4 LEDs and the pins are connected to D10
Adafruit_NeoPixel rgb_2812 = Adafruit_NeoPixel(4, 10, NEO_GRB + NEO_KHZ800);
void setup() {
rgb_2812.begin(); //Activate rgb2818
rgb_2812.setBrightness(100); //Set the initial brightness to 100,(0~255)
rgb_2812.show(); //Initialize all NeoPixels to the closed state
void loop() {
}
After uploading successfully, we can see that the 4 LEDs below the
driver baseplate are respectively bright red, green, blue and white.
66
www.keyestudio.com
keyestudio
.begin(); - We will use it to initialize RGB2812.
0~255, the larger the value, the brighter the LED will be.
of the LED, we must use this function again, otherwise the setting will
not work.
function can make any LED display any color. It must be noted that
the first parameter n is the RGB number to be set, the first LED
67
www.keyestudio.com
keyestudio
//Create a category named rgb_2812 to control 4 LEDs and the pins are connected to D10
Adafruit_NeoPixel rgb_2812 = Adafruit_NeoPixel(4, 10, NEO_GRB + NEO_KHZ800);
void setup() {
rgb_2812.begin(); //Activate rgb2818
rgb_2812.setBrightness(150); //Initial brightness(0~255)
rgb_2812.show(); //Initialize all NeoPixels to the closed state
}
void loop() {
uint8_t r = random(0, 255);
uint8_t g = random(0, 255);
uint8_t b = random(0, 255);
for (uint8_t i = 0; i < 4; i++)
{
rgb_2812.setPixelColor(i, r, g, b);//The color of the I +1 LED is random(r,g,b)
rgb_2812.show(); //Refresh display
delay(100); //Wait for a while
}
}
Project 3: Servo
(1) Description
control the servo angle. But if arduino is used to control the servo
to control the servo rotation. In this project, you will learn how to
control the servo to rotate back and forth between 0° and 180°.
Driver voltage:3.3V or 5V
Control Principle:
corresponds to the rotation angle from 0° to 180°. But note that for
different brand servo, the same signal may have different rotation
board)
//************************************************************************
/*
Keyestudio 4WD Mecanum Robot for Arduino
lesson 3.1
Servo
http://www.keyestudio.com
*/
70
www.keyestudio.com
keyestudio
#define servo_pin 9 //The servo is connected to D9
void setup() {
pinMode(servo_pin, OUTPUT); //Set the servo pin mode to output
}
void loop() {
for (uint8_t angle = 0; angle < 180; angle++)
{
servopulse(servo_pin, angle);
}
for (uint8_t angle = 180; angle > 0; angle--)
{
servopulse(servo_pin, angle);
}
}
void setup() {
myservo.attach(9); //The pin of the servo is connected to D9
}
71
www.keyestudio.com
keyestudio
void loop() {
for (uint8_t angle = 0; angle < 180; angle++)//From 0 to 180 degrees
{
myservo.write(angle); //Rotate to angle
delay(15); //Wait for a while
}
for (uint8_t angle = 180; angle > 0; angle--)//From 180 to 0 degrees
myservo.write(angle); //Rotate to angle
delay(15);
}
}
After uploading the test code, connect the wires of the servo and
power up. The servo will rotate from 0 degrees to 180 degrees and
then from 180 to 0 degrees. However, we will find it rotates faster and
(Note: When we use the servo library file, the PWM output of D9 and
D10 will fail, because they share the same timer 1 with the servo
library.)
to angle.
myangle is 180, the output value is 2500; If myangle has a value of 90,
we have to divide by 1,000 to get ms. The driver cycle of the servo is
understood as high level ), and the low level can be set for the rest of
the cycle.
angle position.
Project 4: Motor
(1) Description
73
www.keyestudio.com
keyestudio
has a matching gear reduction box which provides a lower speed but
The current of the motor driver is relatively large. If we use the IO port
to force the motor to drive, either the motor will not rotate or the IO
DRV8833 motor driver chip has been included on the motor drive
74
www.keyestudio.com
keyestudio
Motor type:F130SA-11200-38V
No-load current:≤80mA
75
www.keyestudio.com
keyestudio
M3 Rotates
M1Rotates M4 Rotates M2 Rotates
Advance clockwise
clockwise (LOW) clockwise (LOW) clockwise (LOW)
(LOW)
M3Rotates
M1 Rotates M4 Rotates M2 Rotates
Move Back anticlock
anticlockwise(HIGH) anticlockwise(HIGH) anticlockwise(HIGH)
wise(HIGH)
M3Rotates
M1Rotates M4 Rotates M2 Rotates
Rotate Left anticlock
clockwise(LOW) clockwise(LOW) clockwise (HIGH)
wise(HIGH)
76
www.keyestudio.com
keyestudio
Translation anticlockwise(HIGH) clockwise (LOW) clockwise (LOW) anticlock
wise(HIGH)
M3 Rotates
Left Front M1 Rotates
M4 Stop M2 Stop Clockwise(LOW
Move clockwise (LOW)
)
M3 Rotates
Right Rear M1 Rotates
M4 Stop M2 Stop anticlock
Move anticlockwise(HIGH)
wise(HIGH)
motor
//*************************************************************************
/*
Keyestudio 4WD Mecanum Robot for Arduino
lesson 4.1
Motor
http://www.keyestudio.com
*/
77
www.keyestudio.com
keyestudio
void setup() {
/****Set all motor control pins to output mode***/
pinMode(M1, OUTPUT);
pinMode(PWM1, OUTPUT);
}
void loop() {
digitalWrite(M1, LOW); //Motor rotates clockwise
analogWrite(PWM1, 100); //Set the speed
delay(2000); //Wait for 2 seconds
digitalWrite(M1, LOW);
analogWrite(PWM1, 0); //Stop when the speed is 0
delay(1000);
digitalWrite(M1, LOW);
analogWrite(PWM1, 0); //Stop when the speed is 0
delay(1000);
}
78
www.keyestudio.com
keyestudio
/****JM2Motor controls pins***/
#define PWM2 5
#define M2 4
/****JM3Motor controls pins***/
#define PWM3 6
#define M3 7
void setup() {
/****All motor control pins are set to output mode***/
pinMode(M1, OUTPUT);
pinMode(PWM1, OUTPUT);
pinMode(M2, OUTPUT);
pinMode(PWM2, OUTPUT);
pinMode(M3, OUTPUT);
pinMode(PWM3, OUTPUT);
pinMode(M4, OUTPUT);
pinMode(PWM4, OUTPUT);
void loop() {
Advance(); //The car advance
delay(2000);
Back(); //The car moves back
delay(2000);
Turn_Left(); //The car turns left
delay(2000);
Turn_Right(); //The car turns right
delay(2000);
Stop(); //The car stops
delay(1000);
}
digitalWrite(M2, LOW);
analogWrite(PWM2, speed2);
digitalWrite(M3, LOW);
analogWrite(PWM3, speed3);
}
digitalWrite(M2, HIGH);
analogWrite(PWM2, 255 - speed2);
digitalWrite(M3, HIGH);
analogWrite(PWM3, 255 - speed3);
}
digitalWrite(M2, HIGH);
analogWrite(PWM2, 255 - speed2);
digitalWrite(M3, HIGH);
analogWrite(PWM3, 255 - speed3);
}
Code2 Result:The car goes forward for 2 seconds, goes back for 2 s,
turns left for 2 s, turns right for 2 s and then stops for 1 s.
81
www.keyestudio.com
keyestudio
(Note: Since the speed control pins used by the right motor are D3
and D11, the frequency of these two PWM outputs are about
there may be some difference in motor speed when we set the same
(1) Description
nt signal.
82
www.keyestudio.com
keyestudio
Black is active at high voltage, while white is active at low volta
ge when detecting. The detection height is 0-3 cm. There are thr
y of the sensor.
nto an electric current signal. When powering on, the diode emit
ual situation.
83
www.keyestudio.com
keyestudio
When infrared diode receives the infrared light, they will generat
ng, the current increases from small to large. However, when the
se to VCC.
outputs a high level. When the light intensity and the current in
the MCU will receive a high level. While a white object is detect
84
www.keyestudio.com
keyestudio
void setup() {
Serial.begin(9600); //Start the serial monitor and set baud rate to 9600
/****All Line Tracking Sensor interface are set to input mode***/
85
www.keyestudio.com
keyestudio
pinMode(SensorLeft, INPUT);
pinMode(SensorMiddle, INPUT);
pinMode(SensorRight, INPUT);
void loop() {
uint8_t SL = digitalRead(SensorLeft); //Read the value of the left Line Tracking Sensor
uint8_t SM = digitalRead(SensorMiddle); //Read the value of the intermediate Line Tracking Sensor
uint8_t SR = digitalRead(SensorRight); //Read the value of the right Line Tracking Sensor
if (SM == HIGH) {
Serial.print("Left:"); //Serial port prints the information
Serial.print(" Middle:");
Serial.print(SM);
Serial.print(" Right:");
Serial.print(SR);
Serial.println(); //Line feed
line feed
line feed
delay(100);
}
board, open the serial monitor and set baud rate to 9600. If the line
tracking sensor does not detect any object, the output signal is high
level, that is, 1. When we use a white object for occlusion, the output
86
www.keyestudio.com
keyestudio
mode.
signal, and then print it out through the serial port. Serial.print(); for
87
www.keyestudio.com
keyestudio
Project 6: Line Tracking Smart Car
(1) Description
In this lesson we will make a line tracking smart car. It works to use a
line tracking sensor to detect the black track of the road, and the road
surface detection signal is fed back to the control board. The control
board analyzes and judges the collected signals, and timely controls
the driving motor to adjust the steering of the car, making the car run
88
www.keyestudio.com
keyestudio
89
www.keyestudio.com
keyestudio
/****JM3Motor controls pins***/
#define PWM3 6
#define M3 7
void setup() {
Serial.begin(9600); //Start the serial monitor and set baud rate to 9600
/****All motor control pins are set to output mode***/
pinMode(M1, OUTPUT);
pinMode(PWM1, OUTPUT);
pinMode(M2, OUTPUT);
pinMode(PWM2, OUTPUT);
pinMode(M3, OUTPUT);
pinMode(PWM3, OUTPUT);
pinMode(M4, OUTPUT);
pinMode(PWM4, OUTPUT);
/****All Line Tracking Sensor interface are set to input mode***/
pinMode(SensorLeft, INPUT);
pinMode(SensorMiddle, INPUT);
pinMode(SensorRight, INPUT);
void loop() {
uint8_t SL = digitalRead(SensorLeft); //Read the value of the left Line Tracking Sensor
uint8_t SM = digitalRead(SensorMiddle); //Read the value of the left Line Tracking Sensor
uint8_t SR = digitalRead(SensorRight); //Read the value of the right Line Tracking Sensor
if (SM == HIGH) {
if (SL == LOW && SR == HIGH) { // black on right, white on left, turn right
Turn_Right();
}
else if (SR == LOW && SL == HIGH) { // black on left, white on right, turn left
Turn_Left();
90
www.keyestudio.com
keyestudio
}
else { // white on both sides, going forward
Advance();
}
}
else {
if (SL == LOW && SR == HIGH) { // black on right, white on left, turn right
Turn_Right();
}
else if (SR == LOW && SL == HIGH) { // white on right, black on left, turn left
Turn_Left();
}
else { // all white, stop
Stop();
}
}
}
digitalWrite(M2, LOW);
analogWrite(PWM2, speed2);
digitalWrite(M3, LOW);
analogWrite(PWM3, speed3);
}
digitalWrite(M2, HIGH);
analogWrite(PWM2, 255 - speed2);
digitalWrite(M3, HIGH);
analogWrite(PWM3, 255 - speed3);
91
www.keyestudio.com
keyestudio
}
digitalWrite(M2, HIGH);
analogWrite(PWM2, 255 - speed2);
digitalWrite(M3, HIGH);
analogWrite(PWM3, 255 - speed3);
}
digitalWrite(M2, LOW);
analogWrite(PWM2, speed2);
digitalWrite(M3, LOW);
analogWrite(PWM3, speed3);
}
92
www.keyestudio.com
keyestudio
After uploading the test code successfully, power up and the smart
Note: (1) The width of the black line must be greater than or equal to
the width of the 2-channel tracking sensor module, the car speed
(2) When testing the car, do not under the sun. If problems
(1) Description
93
www.keyestudio.com
keyestudio
The ultrasonic sensor uses sonar to determine distance to an object
like bats do. It offers excellent non-contact range detection with high
In this project, we will work to show simple ways for distance with
arduino and the ultrasonic sensor, and learn how to use the sensor in
arduino.
Working voltage:+5V DC
Precision: 0.3 cm
Principle
94
www.keyestudio.com
keyestudio
The ultrasonic transmitter emits ultrasonic waves in a certain
direction, and the counter starts timing at the same time of the
time t recorded by the timer, the distance s from the launching point
(1) Pull down TRIG then trigger high level signals with least 10us;
(2) After triggering, the module will automatically send eight 40KHz
(3) If there is a signal return, ECHO outputs a high level, the high level
95
www.keyestudio.com
keyestudio
/*******Ultrasonic Sensor interface*****/
#define EchoPin 13 //ECHO to D13
#define TrigPin 12 //TRIG to D12
void setup() {
Serial.begin(9600); //Set baud rate to 9600
pinMode(EchoPin, INPUT); //The ECHO pin is set to input mode
pinMode(TrigPin, OUTPUT); //The TRIG pin is set to output mode
}
void loop() {
float distance = Get_Distance(); //Get the distance and save in the distance variable
Serial.print("ditance:");
Serial.print(distance);
Serial.println("cm");
delay(100);
}
After uploading the test code successfully, open the serial monitor
and set the baud rate to 9600, the monitor will display the distance
96
www.keyestudio.com
keyestudio
between the ultrasonic sensor and the obstacle, in cm, as shown in
HIGH) calculates the time between the sound wave's emission and its
reflection.
The time is t (us), the total distance back and forth is s=v*t. V i
97
www.keyestudio.com
keyestudio
(1) Description
The ultrasonic sensor detects the smart car and the obstacle distance
98
www.keyestudio.com
keyestudio
/*
Keyestudio 4WD Mecanum Robot for Arduino
lesson 8
Ultrasonic follow Robot
http://www.keyestudio.com
*/
#include <Servo.h>
Servo myservo; //Define an instance of a servo
99
www.keyestudio.com
keyestudio
/****JM1Motor controls pins***/
#define PWM1 3
#define M1 2
/****JM4Motor controls pins***/
#define PWM4 11
#define M4 8
void setup() {
Serial.begin(9600); //Set baud rate to 9600
myservo.attach(9); //The pins of the servo are connected to D9
/****All motor control pins are set to output mode***/
pinMode(M1, OUTPUT);
pinMode(PWM1, OUTPUT);
pinMode(M2, OUTPUT);
pinMode(PWM2, OUTPUT);
pinMode(M3, OUTPUT);
pinMode(PWM3, OUTPUT);
pinMode(M4, OUTPUT);
pinMode(PWM4, OUTPUT);
pinMode(EchoPin, INPUT); //The ECHO pin is set to input mode
pinMode(TrigPin, OUTPUT); //The TRIG pin is set to output mode
myservo.write(90); //Rotate to 90 degrees
delay(100);
}
100
www.keyestudio.com
keyestudio
void loop() {
float distance = Get_Distance(); ///Get the distance and save in the distance variable
if (distance >= 20 && distance <= 40) //The range of advance
{
Advance();
}
else if (distance > 10 && distance < 20) //The range of stop
{
Stop();
}
else if (distance <= 10) //The range of moving back
{
Back();
}
else //Other cases stop
{
Stop();
}
}
digitalWrite(M2, LOW);
analogWrite(PWM2, speed2);
digitalWrite(M3, LOW);
101
www.keyestudio.com
keyestudio
analogWrite(PWM3, speed3);
}
digitalWrite(M2, HIGH);
analogWrite(PWM2, 255 - speed2);
digitalWrite(M3, HIGH);
analogWrite(PWM3, 255 - speed3);
}
digitalWrite(M2, HIGH);
analogWrite(PWM2, 255 - speed2);
digitalWrite(M3, HIGH);
analogWrite(PWM3, 255 - speed3);
}
digitalWrite(M2, LOW);
analogWrite(PWM2, speed2);
digitalWrite(M3, LOW);
analogWrite(PWM3, speed3);
}
After uploading the test code successfully, the servo will rotates to
Note: The obstacles can solely move in front of the car, which can not
turn.
103
www.keyestudio.com
keyestudio
Project 9: Ultrasonic Avoidance Smart Car
(1) Description
Ultrasonic avoidance smart car is used to control the car motion state,
104
www.keyestudio.com
keyestudio
105
www.keyestudio.com
keyestudio
/****JM2Motor controls pins***/
#define PWM2 5
#define M2 4
/****JM3Motor controls pins***/
#define PWM3 6
#define M3 7
void loop() {
distance_M = Get_Distance(); //Get the distance and save in the distance variable
if (distance_M < 20) {//When the distance in front is less than 20cm
Stop(); //Robot stop
delay(500); //Delay 500ms
myservo.write(180); //Ultrasonic cradle head turns left
delay(500); //Delay 500ms
106
www.keyestudio.com
keyestudio
distance_L = Get_Distance(); //Assign the left ultrasonic distance to variable a1
delay(100); //Read values when stable
myservo.write(0); //ltrasonic cradle head turns right
delay(500); //Delay 500ms
distance_R = Get_Distance(); //Assign the right ultrasonic distance to variable a2
delay(100); //Read values when stable
digitalWrite(M2, LOW);
analogWrite(PWM2, speed2);
107
www.keyestudio.com
keyestudio
digitalWrite(M3, LOW);
analogWrite(PWM3, speed3);
}
digitalWrite(M2, HIGH);
analogWrite(PWM2, 255 - speed2);
digitalWrite(M3, HIGH);
analogWrite(PWM3, 255 - speed3);
}
digitalWrite(M2, HIGH);
analogWrite(PWM2, 255 - speed2);
digitalWrite(M3, HIGH);
analogWrite(PWM3, 255 - speed3);
}
digitalWrite(M2, LOW);
analogWrite(PWM2, speed2);
digitalWrite(M3, LOW);
analogWrite(PWM3, speed3);
}
108
www.keyestudio.com
keyestudio
/**********The car stops***********/
void Stop(void) {
digitalWrite(M1, LOW);
analogWrite(PWM1, 0);
digitalWrite(M2, LOW);
analogWrite(PWM2, 0);
digitalWrite(M3, LOW);
analogWrite(PWM3, 0);
digitalWrite(M4, LOW);
analogWrite(PWM4, 0);
}
The car moves forward when the distance from the obstacle in front is
to the left and right to measure the distance. If the left distance is
bigger than the right, the car turns left, otherwise turns right.
(1) Description
demodulation. Its internal IC can complete all the work from the
infrared receiving output compatible with TTL level signal and the
The infrared receiving module made by the receiver has solely three
pins, signal line (the infrared receiving is connected with the A4 pin of
microcontrollers.
In this project, we will seek to print the key values of the IR remote
110
www.keyestudio.com
keyestudio
The time interval of the pulses is used to distinguish between 0 and 1
signals (560us low +560us high is signal 0, 560us low +1680us high is
The user code of the same remote control is unchanged, and the key
difference.
When pressing the key , the remote control sends out the infrared
carrier signal. When the infrared receiving obtains the signal, the
111
www.keyestudio.com
keyestudio
(3) Test Code
/*
Keyestudio 4WD Mecanum Robot for Arduino
lesson 10
IRremote
http://www.keyestudio.com
*/
void setup()
{
Serial.begin(9600);
// In case the interrupt driver crashes on setup, give a clue
// to the user what's going on.
Serial.println("Enabling IRin");
irrecv.enableIRIn(); // Start the receiver
Serial.println("Enabled IRin");
}
void loop() {
if (irrecv.decode(&results)) {
Serial.println(results.value, HEX);
irrecv.resume(); // Receive the next value
}
delay(100);
}
After uploading the test code successfully, open the serial monitor
and set the baud rate to 9600. Send signals with the remote control to
112
www.keyestudio.com
keyestudio
the IR receiving sensor to see the key value of the corresponding
may appear.
113
www.keyestudio.com
keyestudio
(5) Code Explanation
objects will receive infrared signals in the background. Then you can
succeeded.
infrared signal, resume() will run to continue receiving the next set of
signals.
114
www.keyestudio.com
keyestudio
Project 11: IR Remote Control Smart Car
(1) Description
control.
115
www.keyestudio.com
keyestudio
buttons value button
0xFF02FD Stop
:
116
www.keyestudio.com
keyestudio
: 0xFF5AA5 Lower right move
117
www.keyestudio.com
keyestudio
#define speed3 (speed4+30) //Left rear motor speed
void setup()
{
Serial.begin(9600);
/****All motor control pins are set to output mode***/
pinMode(M1, OUTPUT);
pinMode(PWM1, OUTPUT);
pinMode(M2, OUTPUT);
pinMode(PWM2, OUTPUT);
pinMode(M3, OUTPUT);
pinMode(PWM3, OUTPUT);
pinMode(M4, OUTPUT);
pinMode(PWM4, OUTPUT);
// In case the interrupt driver crashes on setup, give a clue
// to the user what's going on.
irrecv.enableIRIn(); // Start the receiver
}
void loop() {
if (irrecv.decode(&results)) {
switch (results.value)
{
case 0xFF629D: Advance(); break;//
case 0xFFA857: Back(); break;//
case 0xFF22DD: Turn_Left(); break;//
case 0xFFC23D: Turn_Right(); break;//
case 0xFF02FD: Stop(); break;//OK
case 0xFF30CF: L_Move(); break;//4
case 0xFF7A85: R_Move(); break;//6
case 0xFF6897: LU_Move(); break;//1
case 0xFF10EF: LD_Move(); break;//7
case 0xFFB04F: RU_Move(); break;//3
case 0xFF5AA5: RD_Move(); break;//9
default: break;
}
irrecv.resume(); // Receive the next value
}
digitalWrite(M2, LOW);
analogWrite(PWM2, speed2);
digitalWrite(M3, LOW);
analogWrite(PWM3, speed3);
}
digitalWrite(M2, HIGH);
analogWrite(PWM2, 255 - speed2);
digitalWrite(M3, HIGH);
analogWrite(PWM3, 255 - speed3);
}
digitalWrite(M2, HIGH);
analogWrite(PWM2, 255 - speed2);
digitalWrite(M3, HIGH);
analogWrite(PWM3, 255 - speed3);
}
digitalWrite(M2, HIGH);
analogWrite(PWM2, 255 - speed2);
digitalWrite(M3, LOW);
analogWrite(PWM3, speed3);
}
digitalWrite(M2, LOW);
analogWrite(PWM2, speed2);
digitalWrite(M3, HIGH);
120
www.keyestudio.com
keyestudio
analogWrite(PWM3, 255 - speed3);
}
digitalWrite(M2, LOW);
analogWrite(PWM2, 0);
digitalWrite(M3, LOW);
analogWrite(PWM3, speed3);
}
digitalWrite(M2, HIGH);
analogWrite(PWM2, 255 - speed2);
digitalWrite(M3, LOW);
analogWrite(PWM3, 0);
}
digitalWrite(M2, LOW);
analogWrite(PWM2, speed2);
digitalWrite(M3, LOW);
analogWrite(PWM3, 0);
}
121
www.keyestudio.com
keyestudio
/**********The car moves on the right rear***********/
void RD_Move(void) {
digitalWrite(M1, HIGH);
analogWrite(PWM1, 255 - speed1);
digitalWrite(M4, LOW);
analogWrite(PWM4, 0);
digitalWrite(M2, LOW);
analogWrite(PWM2, 0);
digitalWrite(M3, HIGH);
analogWrite(PWM3, 255 - speed3);
}
Uploading the test code and powering up. Align the IR remote
(1) Description
122
www.keyestudio.com
keyestudio
change parameters such as the baud rate and device name of the
cost, small size, low power consumption and high sensitivity for
In this project, we will use the BT24 bluetooth module to combine all
modules of the car in one code, which contains all functions except IR
We will work to introduce the installation and use of the APP as well
as the functions of each button on the APP interface, and read the
APP. A dialog box appears on the APP interface, then click "OK" .
4. First turn on the bluetooth of the phone /iPad, and then click the
124
www.keyestudio.com
keyestudio
125
www.keyestudio.com
keyestudio
Find "BT24" in the search results and click "Connect" :
as follows:
126
www.keyestudio.com
keyestudio
Search for mecanum Robot on Google Play or download:
http://8.210.52.206/mecanum_robot.apk
and a dialog box appears. Click "Allow" in the dialog box to open the
bluetooth of the mobile phone. You can also turn on your phone's
Click the icon above, enter the APP and select TANK ROBOT, then
password.
"Connect" in the "BCC micro: bit" dialog box in the Bluetooth search
After the APP is installed, let's test the code together: The bluetooth
Bluetooth.
Upload the code to the development board, and then plug in the
bluetooth module.
/*
Keyestudio 4WD Mecanum Robot for Arduino
lesson 12.1
APP Test
http://www.keyestudio.com
*/
void setup() {
Serial.begin(9600);//Start the serial monitor and set the baud rate to 9600
}
void loop() {
if (Serial.available())//If the receiving area is not empty
{
char ble_val = Serial.read();//Read the data of the bluetooth
Serial.println(ble_val);//The serial monitor prints the read data
}
}
plug it upside down. Connect the bluetooth module and turn on the
Aim at the bluetooth module and press the APP button of the mobile
129
www.keyestudio.com
keyestudio
#include <Adafruit_NeoPixel.h>
#include <Servo.h>
Servo myservo; //Define an instance of a servo
//Create a category named rgb_2812 to control 4 LEDs and the pins are connected to D10
Adafruit_NeoPixel rgb_2812 = Adafruit_NeoPixel(4, 10, NEO_GRB + NEO_KHZ800);
#define LED A3
/********默认速度补偿 30***********/
uint8_t speed1 = 100; //Right front motor speed
uint8_t speed4 = 100; //Right rear motor speed
131
www.keyestudio.com
keyestudio
float distance_M, distance_L, distance_R;
char ble_val;
int color_num = 0;
void setup() {
Serial.begin(9600);//Start the serial monitor and set baud rate to 9600
myservo.attach(9); //The pin of the servo is connected to D9
pinMode(LED, OUTPUT);//Configure 7-color LED pins mode for output
/****All motor control pins are set to output mode***/
pinMode(M1, OUTPUT);
pinMode(PWM1, OUTPUT);
pinMode(M2, OUTPUT);
pinMode(PWM2, OUTPUT);
pinMode(M3, OUTPUT);
pinMode(PWM3, OUTPUT);
pinMode(M4, OUTPUT);
pinMode(PWM4, OUTPUT);
/****All interfaces of the Line Tracking Sensor are set to input mode***/
pinMode(SensorLeft, INPUT);
pinMode(SensorMiddle, INPUT);
pinMode(SensorRight, INPUT);
/***********main loop***************/
void loop() {
if (Serial.available())//If the receiving area is not empty
{
ble_val = Serial.read();//Read Bluetooth data
Serial.println(ble_val);//The serial prints the read data
switch (ble_val)
{
/*********************小车行驶************************/
132
www.keyestudio.com
keyestudio
case 's': Stop(); break; //Stop
case 'a': Advance(); break; //Go ahead
case 'c': Back(); break; //retreat
case 'b': Turn_Left(); break; //Turn left
case 'd': Turn_Right(); break; //Turn right
case 'k': L_Move(); break; //Left shift
case 'h': R_Move(); break; //Right shift
case 'l': LU_Move(); break; //Upper left move
case 'j': LD_Move(); break; //lower left move
case 'g': RU_Move(); break; //Upper right move
case 'i': RD_Move(); break; //lower right move
case 'e': drift_left(); break; //Drift
case 'f': drift_right(); break; //Drift
default: break;
}
}
}
/*********************Obstacle avoidance*******************************/
void Avoidance(void)
{
while (1)
{
distance_M = Get_Distance(); //Get the distance and save in the distance variable
if (distance_M < 20) {//When the distance in front is less than 20cm
Stop(); //Robot stop
delay(500); //Delay 500ms
myservo.write(180); //Ultrasonic cradle head turns left
delay(500); //延时 500ms
distance_L = Get_Distance(); //Assign the left ultrasonic distance to variable a1
delay(100); //Read values when stable
myservo.write(0); //Ultrasonic cradle head turns right
delay(500); //Delay 500ms
distance_R = Get_Distance(); //Assign the right ultrasonic distance to variable a2
delay(100); //Read values when stable
/*********************Follow*******************************/
void Follow(void)
{
while (1)
{
float distance = Get_Distance(); //Get the distance and save in the distance variable
if (distance >= 20 && distance <= 40) //Range of advance
{
Advance();
}
else if (distance > 10 && distance < 20) //Range of stop
{
Stop();
}
else if (distance <= 10) //Range of fall back
{
Back();
}
else //Other cases stop
{
Stop();
}
135
www.keyestudio.com
keyestudio
ble_val = Serial.read();//Read the data of the bluetooth
if (ble_val == 's') {
Stop();
break;
}
}
}
/*********************Line Tracking*******************************/
void Tracking(void) { //Tracking black line
while (1)
{
uint8_t SL = digitalRead(SensorLeft); //Read the value of the left Line Tracking Sensor
uint8_t SM = digitalRead(SensorMiddle); //Read the value of the intermediate Line Tracking Sensor
uint8_t SR = digitalRead(SensorRight); //Read the value of the right Line Tracking Sensor
if (SM == HIGH) {
if (SL == LOW && SR == HIGH) { // black on right, white on left, turn right
Turn_Right();
}
else if (SR == LOW && SL == HIGH) { // black on left, white on right, turn left
Turn_Left();
}
else { // white on both sides, going forward
Advance();
}
}
else {
if (SL == LOW && SR == HIGH) { // black on right, white on left, turn right
Turn_Right();
}
else if (SR == LOW && SL == HIGH) { // white on right, black on left, turn left
Turn_Left();
}
else { // all white, stop
Stop();
}
}
ble_val = Serial.read();//Read the data of the bluetooth
if (ble_val == 's') {
Stop();
break;
}
}
136
www.keyestudio.com
keyestudio
}
/*********************RGB2812 display*******************************/
void showColor() {
// Serial.print("color num:"); //Serial debugging
// Serial.println(color_num);
// There are only 7 colors, you can add them yourself
if (color_num > 6)color_num = 0;
if (color_num < 0)color_num = 6;
switch (color_num) {
case 0:
for (int i = 0; i < 4; i++) {
rgb_2812.setPixelColor(i, 255, 0, 0); //The iLED is red
}
rgb_2812.show(); //Display
break;
case 1:
for (int i = 0; i < 4; i++) {
rgb_2812.setPixelColor(i, 255, 80, 0); //The iLED is orange
}
rgb_2812.show(); //Display
break;
case 2:
for (int i = 0; i < 4; i++) {
rgb_2812.setPixelColor(i, 255, 255, 0); //The iLED is yellow
}
rgb_2812.show(); //Display
break;
case 3:
for (int i = 0; i < 4; i++) {
137
www.keyestudio.com
keyestudio
rgb_2812.setPixelColor(i, 0, 255, 0); //The iLED is green
}
rgb_2812.show(); //Display
break;
case 4:
for (int i = 0; i < 4; i++) {
rgb_2812.setPixelColor(i, 0, 0, 255); //The iLED is blue
}
rgb_2812.show(); //Display
break;
case 5:
for (int i = 0; i < 4; i++) {
rgb_2812.setPixelColor(i, 0, 255, 255); //The iLED is indigo
}
rgb_2812.show(); //Display
break;
case 6:
for (int i = 0; i < 4; i++) {
rgb_2812.setPixelColor(i, 160, 32, 240);//The iLED is purple
}
rgb_2812.show(); //Display
break;
default : break;
}
}
/*********************Close RGB2812*******************************/
void closeColor() { //Close aii 2818 LEDs
for (int i = 0; i < 4; i++) {
rgb_2812.setPixelColor(i, 0, 0, 0); //The iLED goes off
rgb_2812.show(); //Execute display
}
}
digitalWrite(M2, LOW);
analogWrite(PWM2, speed2);
138
www.keyestudio.com
keyestudio
digitalWrite(M3, LOW);
analogWrite(PWM3, speed3);
}
digitalWrite(M2, HIGH);
analogWrite(PWM2, 255 - speed2);
digitalWrite(M3, HIGH);
analogWrite(PWM3, 255 - speed3);
}
digitalWrite(M2, HIGH);
analogWrite(PWM2, 255 - speed2);
digitalWrite(M3, HIGH);
analogWrite(PWM3, 255 - speed3);
}
digitalWrite(M2, LOW);
analogWrite(PWM2, speed2);
digitalWrite(M3, LOW);
analogWrite(PWM3, speed3);
}
139
www.keyestudio.com
keyestudio
/**********The car stops***********/
void Stop(void) {
digitalWrite(M1, LOW);
analogWrite(PWM1, 0);
digitalWrite(M2, LOW);
analogWrite(PWM2, 0);
digitalWrite(M3, LOW);
analogWrite(PWM3, 0);
digitalWrite(M4, LOW);
analogWrite(PWM4, 0);
}
digitalWrite(M2, HIGH);
analogWrite(PWM2, 255 - speed2);
digitalWrite(M3, LOW);
analogWrite(PWM3, speed3);
}
digitalWrite(M2, LOW);
analogWrite(PWM2, speed2);
digitalWrite(M3, HIGH);
analogWrite(PWM3, 255 - speed3);
}
digitalWrite(M2, LOW);
analogWrite(PWM2, 0);
digitalWrite(M3, LOW);
analogWrite(PWM3, speed3);
}
digitalWrite(M2, HIGH);
analogWrite(PWM2, 255 - speed2);
digitalWrite(M3, LOW);
analogWrite(PWM3, 0);
}
digitalWrite(M2, LOW);
analogWrite(PWM2, speed2);
digitalWrite(M3, LOW);
analogWrite(PWM3, 0);
}
digitalWrite(M2, LOW);
analogWrite(PWM2, 0);
digitalWrite(M3, HIGH);
analogWrite(PWM3, 255 - speed3);
}
digitalWrite(M2, LOW);
analogWrite(PWM2, 0);
digitalWrite(M3, HIGH);
analogWrite(PWM3, 255 - speed3);
}
digitalWrite(M2, LOW);
analogWrite(PWM2, 0);
digitalWrite(M3, LOW);
analogWrite(PWM3, speed3);
}
Click to open the 7-color LED, click it again the LED will
be turned off.
Click to enter tracking mode, click it again will exit the mode.
Click to enter follow mode, click it again will exit the mode.
the mode.
speed of the two motors on the left and the same operation on the
right.
These buttons are used to switch the color of the four 2812
LEDs under the bottom plate, and the middle button is used to close
the function.
The rest of the buttons are all used to drive the car, but unlike the
other buttons, they drive when we press them and stop when we
143
www.keyestudio.com
keyestudio
release them.
8. Common Problems
9. Resource
https://fs.keyestudio.com/KS0551
144
www.keyestudio.com