I am tring to build a line follower robot, i have an h-bridge and arduino to control the direction and speed.
I burnt this code to my arduino board, but the robot just go forward and never go on the oppsite direction:
int enA = 10;
int in1 = 9;
int in2 = 8;
// motor two
int enB = 5;
int in3 = 7;
int in4 = 6;
void setup()
{
pinMode(enA, OUTPUT);
pinMode(enB, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
}
void demoOne()
{
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
analogWrite(enA, 200);
// turn on motor B
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
// set speed to 200 out of possible range 0~255
analogWrite(enB, 200);
delay(2000);
// now change motor directions
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
delay(2000);
// now turn off motors
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
void loop()
{
demoOne();
delay(1000);
demoTwo();
delay(1000);
}
How to adjust the code to make it go for both directions?
UPDATE:
I am using h bridge l298n and four dc motors "2 right and 2 left", powering it with two 9v batteries and powering the arduino uno with 5v which i get from the h bridge based on this article:
https://hackerstore.nl/PDFs/Tutorial298.pdf
enA, in1, and in2 for the two right motors
enB, in3, and in4 for the two left motors
Your code looks perfectly fine, make sure your hardware is working properly and that everything is connected properly, also make sure that you are not using the 5V from your Arduino to power the motors since the small voltage regulator on the Arduino board is not capable of handling high currents such as 500mA (Unless you replace it with a bigger regulator and give it a big heatsink), if you are powering the arduino and motors from USB make sure your USB port can handle the power required by the two motors, oh and make sure pins 10 and 5 are PWM pins
Also using a dedicated motor library may help to simplify your code, I wrote you one here:
#include <Arduino.h>
#include <stdbool.h>
#define enA 10
#define enB 5
#define i1 8
#define i2 9
#define i3 6
#define i4 7
void initMotors(){
pinMode(enA, OUTPUT);
pinMode(enB, OUTPUT);
pinMode(i1, OUTPUT);
pinMode(i2, OUTPUT);
pinMode(i3, OUTPUT);
pinMode(i4, OUTPUT);
}
void motor1Stop(){
digitalWrite(i1, LOW);
digitalWrite(i2, LOW);
}
void motor2Stop(){
digitalWrite(i3, LOW);
digitalWrite(i4, LOW);
}
void motorsEnabled(bool en){
digitalWrite(enA, en);
digitalWrite(enB, en);
}
void enableMotors(){
motorsEnabled(HIGH);
}
void motor1Forward(){
digitalWrite(i1, HIGH);
digitalWrite(i2, LOW);
}
void motor1Backward(){
digitalWrite(i1, LOW);
digitalWrite(i2, HIGH);
}
void motor2Forward(){
digitalWrite(i3, LOW);
digitalWrite(i4, HIGH);
}
void motor2Backward(){
digitalWrite(i3, HIGH);
digitalWrite(i4, LOW);
}
To include this just make a new tab and name it whatever you want (as long as there are no spaces and it ends in .h), then add #include "name.h" to the beginning of your code, this will help you to reduce future bugs
For speed control you can add this:
void setMotorSpeeds(int motor1, int motor2){
analogWrite(enA, motor1);
analogWrite(enB, motor2);
}
Your code is fine, so you will need to identify the problem by "divide and conquer"
Connect a single motor to each channel, and forget the arduino part for now.
Connect the L298 power supply. If you read the instructions you will see that you can use the integrated 5V power regulator, or you can supply an external 5V. If using a different power supply for 5V and Motors make sure you connect both GND together otherwise it won't work.
Make sure you have the driver properly connected to power supply, take two cables and use them to connect in1 to GND, in2 to 5V and enA to 5V (without the arduino, just manually connect them with a cable). One of the motors should turn one side.
Now connect in1 to 5V and in2 to GND (keeping enA connected to 5V), the motor should turn to the other side.
If this does not happen then you are not properly connecting the L298 or it is damaged.
If it works then the problem comes from your arduino. Connect 3 LEDs, one in the pin9, one in the pin 8 and one in the pin 10 (which are the pins you connect to in1 and in2 and enA).
Run your program and you should see the LEDS turn on and off accordingly.
If not, your arduino has a problem in some pins (maybe you short circuited them?)
If both experiments work there is absolutely no reason for them to not work together, so start small, divide your problem into pieces and identify it.
Good luck.
Related
I need to write a program in Arduino that turns ON or OFF two LEDs independently depending on the data received via serial communication. For example, the first LED will turn on if the Arduino board receives a1,and it will turn OFF if a2 is received. but I require help on doing this. i havent started on this yet but i am trying to do it using 2 blinking light code. I am new to Arduino programming and i don't understand some concepts. but i can definitely use help on doing this.
int LEDred = 3;
int LEDgreen = 6;
void setup() {
pinMode (LEDred, OUTPUT);
pinMode (LEDgreen, OUTPUT);
}
void loop() {
digitalWrite (LEDred, HIGH);
digitalWrite (LEDgreen, LOW);
delay (1000);
digitalWrite (LEDred, LOW);
digitalWrite (LEDgreen, HIGH);
delay (1000);
}
Use 1 or 2 instead of a1 and a2. Because it's easier to process.Consider you send 1 via serial port. Read the signal by
byte val;
if(Serial.available()>0){
val=Serial.read();
}
Then use another if statement in order to blink red or green LED
I have a multi-cooker which is not working so I decided to use its PCB for my project. It has an STM32f103c8t7 chip on it. some LEDs and a buzzer and a display, which I may not need though. I have found the connection between chip pins and elements on the board (for example the buzzer is connected to the pin number 13, "PA3") but I have a problem. since this is my first try with stm32 in arduino, I don't know how to name the pins of chip. I have tried PA3, 13 and D13 but none of them seem to to useful. what should I do to make the board buzz?
the buzzer is ok and works fine. Actually one of the buzzer's pin is connected to 12 V and another pin is connected to a transistor which its base is connected to the chip.
this is the code that I have tried:
void setup() {
pinMode(PA3, OUTPUT);
// pinMode(13, OUTPUT);
// pinMode(D13, OUTPUT);
}
void loop() {
digitalWrite(PA3, HIGH);
delay(delayTime);
digitalWrite(PA3, LOW);
delay(delayTime);
// digitalWrite(13, HIGH);
// delay(delayTime);
// digitalWrite(13, LOW);
// delay(delayTime);
// digitalWrite(D13, HIGH);
// delay(delayTime);
// digitalWrite(D13, LOW);
// delay(delayTime);
}
new to arduino programming, making a proximity sensor with an HC-SRO4 module. It works almost flawlessly when connected to my computer via USB, but whenever I connect it to the wall, it stops working. What I've noticed is that the "TX" light also isn't on when it's connected to the wall, but it is when connected to the PC. The adapter i'm using when it's plugged into the wall is 9V/1A DC that came with the arduino.
void setup() {
#define LED 8
#define trigPin 12
#define echoPin 13
Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(LED, OUTPUT);
}
void loop() {
int duration, distance;
digitalWrite(trigPin, HIGH);
delayMicroseconds(1000);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration/2) / 29.1
;if (distance >= 60 || distance <= 0){
Serial.println("no object detected");
digitalWrite(LED, LOW);}
else {
Serial.println("object detected");
digitalWrite(LED, HIGH);
}}
There is a bug where the serial command suche as serial.begin, serial.write and serial.read if they are meant to for debug purposes on your cpu have a blocking effect on your program. I've experienced it once or twice so try commenting those lines out.
Im using an arduino and an hc-06 to communicate with an android. I'm trying to send int values over, but the android says it's receiving empty strings. This is my code:
#include <SoftwareSerial.h>
#define rxPin 11 // define SoftwareSerial rx data pin
#define txPin 10 // define SoftwareSerial tx data pin
#define trigPin 5
#define echoPin 6
SoftwareSerial blueTooth(rxPin, txPin);
void setup() {
Serial.begin (9600);
blueTooth.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
void loop() {
int duration, distance;
digitalWrite(trigPin, LOW); // Added this line
delayMicroseconds(2); // Added this line
digitalWrite(trigPin, HIGH);
delayMicroseconds(10); // Added this line
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration/2) / 29;
Serial.println(distance);
blueTooth.print ((int)(Serial.read()));
delay(200);
}
I think what you want is
blueTooth.print(distance);
First suggestion, try switching the rx and tx pins. I know I've messed that up a bunch. If you didn't know, the rx from the hc-06 should be defined as the tx pin in software serial and visa versa. Michael Yu's comment is definitely preferred to what you originally had. The other thing I can suggest is posting the android code that receives and parses the incoming data.
My string sending function for arduino:
void sendStr(String str){
char b[2];
for(int i = 0; i < str.length(); i++){
String dataSend = str.substring(i,i+1);
dataSend.toCharArray(b,2);
bluetooth.print(b);
delay(1);
}
}
I am doing a basic project in Arduino UNO connecting an Ultra Sonic sensor (HC-SR04) which should print in the serial monitor the distance of the closest object but it always print 0.
This is my code:
long distance;
long time;
void setup(){
Serial.begin(9600);
pinMode(4, OUTPUT);
pinMode(2, INPUT);
}
void loop(){
digitalWrite(2,LOW);
delayMicroseconds(5);
digitalWrite(2, HIGH);
delayMicroseconds(10);
time = pulseIn(4, HIGH);
distance = int(0.017*time);
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm.");
delay(1000);
}
And this is the breadboard:
The primary issue that I see is that your code doesn't match your wiring diagram.
For example, your diagram shows Trig connected to pin 4. The Trig should be the output from your Arduino but you have it defined as an input.
The Echo is connected to pin 2 and it should be an input, but you have it defined as an output.
Finally, in your loop(), you are not even using pin 2 or pin 4, but pins 9 and 8. Another issue is the timing you use in setting the trigger pulse - it does not match the datasheet. I would do something like this (assuming that you are actually connected to the pins shown in your diagram):
#define sensorTrigPin 4
#define sensorEchoPin 2
void setup()
{
Serial.begin(9600);
pinMode(sensorTrigPin, OUTPUT);
pinMode(sensorEchoPin, INPUT);
}
void loop()
{
int pulseWidth = 0;
digitalWrite(sensorTrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(sensorTrigPin, LOW);
pulseWidth = pulseIn(sensorEchoPin, HIGH);
Serial.print("Pulse Width: ");
Serial.print(pulseWidth);
delay(1000);
}
Note that pulseWidth is just the amount of time that it takes from the beginning of the Echo pulse going high to the end of the same pulse (when it goes low). You would still have to calculate the distance based on the value of pulseWidth.
UPDATE BASED ON RECENT EDIT TO THE QUESTION
If you change a portion of your loop() code to this, it should work:
void loop(){
digitalWrite(4, HIGH); //was (2, LOW)
delayMicroseconds(10); //was (5)
digitalWrite(4, LOW); //was (2, HIGH)
//REMOVED EXTRA DELAY
time = pulseIn(2, HIGH); //was (4,HIGH);
... //Keep the rest of your code the same.
}
Try connecting your VCC of the sensor to 3V3 instead of 5V. This might sound odd, but I tried it and it worked well. Also, please make sure that your echo and trig pin match the code.