Hi, I need some help with setting up servo motor on my arduino micro. Whenever I use the basic codes they work but other parts of the code wont work... does anyone have any idea why is that and how to fix it ?
Please post your code and a connection diagram so we can zero in on the problem faster. And let us know what other parts of the code we have not seen won't work, and how you know that.
Should I post the whole code? Because it's 900 lines
What ports are you using for the servos?
Have you checked that those ports are not used elsewhere, possibly by libraries you may be using?
I'ts D0 and no it shouldn't be use its not used anywhere and I don't have any other libaries
Not even Serial() output?
Yes. As professional the total code was 250 000 lines. Okey, divided in some parts.
Else You might get 900 guesses as replies....
**#include <Servo.h>**
**Servo myservo1;** // create servo object to control a servo
int pozicija = 0;
int JaudaMotL = 200;
int JaudaMotK = 200;
int MotL_en = 9;
int MotK_en = 10;
int MotL_D1 = 7;
int MotL_D2 = 8;
int MotK_D1 = 11;
int MotK_D2 = 12;
int motState = 0;
int prevMotState = 0;
int RobState = 0;
int MotStateTimer = 0;
int GaidaNoSakuma = 1;
int gaidisana = 0;
int PiebraucPrieksa = 1;
int gaidisana2 = 0; //atbild par skaitisanu ringa apraugsanas funkcijai
int flank = 0; //atbild par ringa apbraugsanu
int stav = 0; // atbild par to lai programma tiktu palaista vienreiz cinas laika
int prog = 0; // atbild par izvēlēto programmu
int stav2 = 1; // atbild par izkustesanos ja frontala sadursme 2 sec
int gaida = 0; // atbild par izkusteanos ja frontala sadrusem ir 2 sec
int state = 0; // atbild par robota ieslegsanu(kad uzspiez pogu)
int state2 = 1; //atbild par robota ieslegsanos pec restarta
int delays = 0; //atbild lai es varetu tikt vala no delayiem
int gdelays = 0; // atbild par delaju iebraucot ringa un gaidot
int reizi = 1; // suds
**int karogs = 0; // servo karogs**
int idelay = 0;
int IR_State = 0;
void setup() {
TCCR1B = (TCCR1B & 0b11111000) | 0x01;
pinMode(MotL_en, OUTPUT);
pinMode(MotK_en, OUTPUT);
pinMode(MotL_D1, OUTPUT);
pinMode(MotL_D2, OUTPUT);
pinMode(MotK_D1, OUTPUT);
pinMode(MotK_D2, OUTPUT);
pinMode(13, OUTPUT);
pinMode(15, OUTPUT);
pinMode(5, OUTPUT);
pinMode(16, INPUT);
pinMode(4, INPUT);
pinMode(1, INPUT);
analogWrite(MotL_en, JaudaMotL);
analogWrite(MotK_en, JaudaMotK);
**myservo1.attach(0, 600, 2300);**
** myservo1.write(100);**
motori_STOP();
// Lasām vērtības uzreiz no reģistriem un izpildām nosacījuma operatora darbības
// Šis ir daudz ātrāk nekā loopā lasīt vērtības un tad salīdzināt if`ā
// Atgriež uzreiz vai redz vai nē pretinieku un vai ir vai nav uz ringa
// Pašiem jānosaka skaitliskā vērtība pēc nepieciešamības
pinMode(A1, INPUT);
#define Sen_KS analogRead(A1) > 300
pinMode(A0, INPUT);
#define Sen_K analogRead(A0) > 200
pinMode(A2, INPUT);
#define Sen_Pr analogRead(A2) > 200
pinMode(A3, INPUT);
#define Sen_LS analogRead(A3) > 300
pinMode(A4, INPUT);
#define Sen_L analogRead(A4) > 200
pinMode(A5, INPUT);
#define Sen_Pr_K analogRead(A5) < 200
pinMode(A7, INPUT);
#define Sen_Pr_L analogRead(A7) < 200
Serial.begin(9600);
}
void loop() {
//Ja šo neizmanto jākomentē ciet, tikai vērtību noteikšanai un testēšanai
/*
Serial.print("Sen_Pr ");
Serial.println(analogRead(A2) );
Serial.print("Sen_KS ");
Serial.println(analogRead(A1) );
Serial.print("Sen_K ");
Serial.println(analogRead(A0) );
Serial.print("Sen_L ");
Serial.println(analogRead(A4) );
Serial.print("Sen_LS ");
Serial.println(analogRead(A3) );
Serial.print("Sen_Pr_K ");
Serial.println(analogRead(A5) );
Serial.print("Sen_Pr_L ");
Serial.println(analogRead(A7) );
Serial.println("--------------------------------");
delay(300);
*/
if (digitalRead(16) == LOW) {
state = state + 1;
if (state > 1) {
state = 0;
}
}
if (digitalRead(1) == HIGH && state == 0 && IR_State == 0) {
state = 1;
IR_State = 1;
}
if (digitalRead(1) == LOW && state == 1 && IR_State == 1) {
state = 0;
IR_State = 0;
}
if (state == 1 && state2 == 1) {
RobState = 1;
digitalWrite(15, HIGH);
delay(100);
for (int i = 0; i < 5; i++) {
stav = 0;
digitalWrite(5, HIGH);
delay(495);
digitalWrite(5, LOW);
delay(495);
}
state2 = 0;
}
if (state == 0) {
RobState = 0;
}
// Izvele 1 tupi braukt uz prieksu-> D5
// Izvele 2 iebraukt pa labo ringa malu-> D13
// Izvele 3 iebraukt pa kreiso ringa malu-> D5, D13
// Izvele 4 Gaida laika sakuma vienreiz-> RX
// Izvele 5 Iebrauc ieksa 2 reiz un ta giada vienreiz-> TX
// Izvele 6 Ievrauc uzreiz ieks un gaid-> D5,D13,RX
// Izvele 7 Piebrauc baito pretinieku-> D5,D13,TX
// Izvele 8 Iebrauc centra un radars-> D5, TX
// Izvele 9 Gaida laika sakuma vienmer-> TXD, RX
// Izvele 10 Tirit riepas-> Neviena nedeg
if (digitalRead(4) == LOW) {
prog = prog + 1;
if (prog > 9) {
prog = 0;
}
delay(200);
}
if (prog == 0) {
digitalWrite(5, HIGH);
digitalWrite(13, LOW);
RXLED0;
TXLED0;
}
if (prog == 1) {
digitalWrite(5, LOW);
digitalWrite(13, HIGH);
RXLED0;
TXLED0;
}
if (prog == 2) {
digitalWrite(5, HIGH);
digitalWrite(13, HIGH);
RXLED0;
TXLED0;
}
if (prog == 3) {
digitalWrite(5, LOW);
digitalWrite(13, LOW);
RXLED1;
TXLED0;
}
if (prog == 4) {
digitalWrite(5, LOW);
digitalWrite(13, LOW);
RXLED0;
TXLED1;
}
if (prog == 5) {
digitalWrite(5, HIGH);
digitalWrite(13, HIGH);
RXLED1;
TXLED0;
}
if (prog == 6) {
digitalWrite(5, LOW);
digitalWrite(13, LOW);
RXLED1;
TXLED1;
}
if (prog == 7) {
digitalWrite(5, HIGH);
digitalWrite(13, HIGH);
RXLED0;
TXLED1;
}
if (prog == 8) {
digitalWrite(5, HIGH);
digitalWrite(13, LOW);
RXLED1;
TXLED0;
}
if (prog == 9) {
digitalWrite(5, LOW);
digitalWrite(13, LOW);
RXLED0;
TXLED0;
}
if (RobState == 1) {
**if (karogs == 0) {**
** karogs_nolaid();**
** }**
if (prog == 9) {
analogWrite(MotL_en, 250);
analogWrite(MotK_en, 250);
motori_Taisni();
}
motState = 0; //Nonullē mainīgo
//Pieskaitām motoru stāvoklim sensora noteikto vērtību ts ir, 1 vai 2 vai 4
// iznākums ir summu kobinācijas, kas atšķiras ir unikālā un varam veikt kādas darbības
if (Sen_Pr_K) // Prieksas kreisais linijas sensors
{
motState = motState + 1;
stav = 1;
}
if (Sen_Pr_L) // Prieksas labas linijas sensors
{
motState = motState + 2;
stav = 1;
}
if (Sen_K) // Taluma kreisais sensors
{
motState = motState + 8;
stav = 1;
}
if (Sen_Pr) // Taluma prieksas sensors
{
motState = motState + 16;
stav = 1;
}
if (Sen_L) // Taluma labais sensors
{
motState = motState + 32;
stav = 1;
}
if (Sen_LS) // Taluma labais slipi sensors
{
motState = motState + 100;
stav = 1;
}
if (Sen_KS) // Taluma kreisais slipi sensors
{
motState = motState + 200;
stav = 1;
}
prevMotState = motState;
//motState tagad glabā sensoru
//stāvokļa vērtību
switch (motState) {
//Switch struktūra nolasa mainīgo, kas satāv no unikālajām skaitļu summām
//un izsauc nepieciešmao funkciju
case 0: //Neviens nav nostrādājis
analogWrite(MotL_en, 200);
analogWrite(MotK_en, 200);
motori_Taisni();
if (prog == 8) // Gaida visualaik
{
Gaida();
}
if (stav == 0) {
if (prog == 0) // Sakuma uzbrukums
{
analogWrite(MotL_en, 250);
analogWrite(MotK_en, 250);
motori_Taisni();
}
if (prog == 1) // Sakuma uzbrukums izbraucot pa ringa labo pusi
{
IzbrPaLabiJ();
}
if (prog == 2) // Sakuma uzbrukums izbraucot pa ringa kreiso pusi
{
IzbrPaKreisiJ();
}
if (prog == 3) // Gaida vienreiz
{
Gaida();
}
if (prog == 4) // iebrauc gaida iebrauc
{
gaida_kruta();
}
if (prog == 5) // iebraucc dzili gaida
{
gaida_iebrauc();
}
if (prog == 6) // pabaito pretinieku iebrauc pa kreisi un ta atpakal
{
bait();
}
if (prog == 7) // iebrauc centra un radars
{
radars();
}
}
break;
case 1: //Kreisais sensors
analogWrite(MotL_en, 250);
analogWrite(MotK_en, 250);
// motori_atpakl();
// delay(200);
if (delays < 200) {
motori_PaLabi();
delay(1);
delays = delays + 1;
}
delays = 0;
stav = 1;
break;
case 2: //Labais sensors
analogWrite(MotL_en, 250);
analogWrite(MotK_en, 250);
// motori_atpakl();
// delay(250);
if (delays < 200) {
motori_PaKreisi();
delay(1);
} else {
delays = 0;
}
stav = 1;
break;
case 3: //Abi priekšējie
analogWrite(MotL_en, 250);
analogWrite(MotK_en, 250);
if (delays > 220) {
motori_atpakl();
delay(1);
} else {
delays = 0;
}
if (delays > 250) {
motori_PaLabi();
delay(1);
} else {
delays = 0;
}
stav = 1;
break;
case 7: //Visi sensori nostrādājuši
motori_STOP();
break;
case 8: //Sen_k sākas pretinieksa meklesana
analogWrite(MotL_en, 250);
analogWrite(MotK_en, 250);
motori_PaKreisi();
stav = 1;
break;
case 16: //Sen_PR
analogWrite(MotL_en, 255);
analogWrite(MotK_en, 255);
//if(stav2 == 0){
motori_Taisni();
/* }
if (stav2 == 1)
{
if(gaida < 4000)
{
gaida = gaida + 1;
motori_Taisni();
delay(1);
}
else if(gaida >= 4000)
{
Izkusteties();
stav2 = 0;
}
}
*/
stav = 1;
break;
case 19: //Sen_Pr_K/L un Sen_Pr uzbrukums
analogWrite(MotL_en, 250);
analogWrite(MotK_en, 250);
motori_Taisni();
stav = 1;
break;
case 24: //Sen_k
analogWrite(MotL_en, 250);
analogWrite(MotK_en, 250);
motori_Taisni();
break;
case 32: //Sen_L
analogWrite(MotL_en, 250);
analogWrite(MotK_en, 250);
motori_PaLabi();
stav = 1;
break;
case 48: //Sen_L
analogWrite(MotL_en, 250);
analogWrite(MotK_en, 250);
motori_Taisni();
stav = 1;
break;
case 100: // Sen_LS
analogWrite(MotL_en, 250);
analogWrite(MotK_en, 250);
motori_PaLabi();
stav = 1;
break;
case 116: // Sen_LS un Sen_PR
analogWrite(MotL_en, 250);
analogWrite(MotK_en, 250);
motori_PaLabi();
stav = 1;
break;
case 132: // Sen_LS un Sen_L
analogWrite(MotL_en, 250);
analogWrite(MotK_en, 250);
motori_PaLabi();
stav = 1;
break;
case 200: // Sen_KS
analogWrite(MotL_en, 250);
analogWrite(MotK_en, 250);
motori_PaKreisi();
stav = 1;
break;
case 208: // Sen_KS un Sen_K
analogWrite(MotL_en, 250);
analogWrite(MotK_en, 250);
motori_PaKreisi();
stav = 1;
case 216: // Sen_KS un Sen_PR
analogWrite(MotL_en, 250);
analogWrite(MotK_en, 250);
motori_PaKreisi();
stav = 1;
break;
}
} else {
motori_STOP();
}
}
void motori_STOP() {
analogWrite(MotL_en, 0);
analogWrite(MotK_en, 0);
digitalWrite(MotL_D1, HIGH);
digitalWrite(MotL_D2, HIGH);
digitalWrite(MotK_D1, HIGH);
digitalWrite(MotK_D2, HIGH);
}
void motori_Taisni() {
digitalWrite(MotL_D1, HIGH);
digitalWrite(MotL_D2, LOW);
digitalWrite(MotK_D1, LOW);
digitalWrite(MotK_D2, HIGH);
}
void motori_atpakl() {
digitalWrite(MotL_D1, LOW);
digitalWrite(MotL_D2, HIGH);
digitalWrite(MotK_D1, HIGH);
digitalWrite(MotK_D2, LOW);
}
void motori_PaKreisi() {
digitalWrite(MotL_D1, LOW);
digitalWrite(MotL_D2, HIGH);
digitalWrite(MotK_D1, LOW);
digitalWrite(MotK_D2, HIGH);
}
void motori_PaLabi() {
digitalWrite(MotL_D1, HIGH);
digitalWrite(MotL_D2, LOW);
digitalWrite(MotK_D1, HIGH);
digitalWrite(MotK_D2, LOW);
}
void Izkusteties() {
motori_PaLabi();
delay(300);
stav2 = 0;
}
void IzbrPaLabiJ() {
if (flank == 0) {
analogWrite(MotL_en, 90);
analogWrite(MotK_en, 150);
if (gaidisana2 < 900) {
gaidisana2 = gaidisana2 + 1;
digitalWrite(MotL_D1, HIGH);
digitalWrite(MotL_D2, LOW);
digitalWrite(MotK_D1, LOW);
digitalWrite(MotK_D2, HIGH);
delay(1);
} else {
flank = 1;
gaidisana2 = 0;
}
}
if (flank == 1) {
analogWrite(MotL_en, 150);
analogWrite(MotK_en, 150);
if (gaidisana2 < 160) {
gaidisana2 = gaidisana2 + 1;
digitalWrite(MotL_D1, LOW);
digitalWrite(MotL_D2, HIGH);
digitalWrite(MotK_D1, LOW);
digitalWrite(MotK_D2, HIGH);
delay(1);
} else {
flank = 2;
gaidisana2 = 0;
}
}
if (flank == 2) {
analogWrite(MotL_en, 150);
analogWrite(MotK_en, 150);
if (gaidisana2 < 50) {
gaidisana2 = gaidisana2 + 1;
digitalWrite(MotL_D1, HIGH);
digitalWrite(MotL_D2, LOW);
digitalWrite(MotK_D1, LOW);
digitalWrite(MotK_D2, HIGH);
delay(1);
} else {
stav = 1;
}
}
}
void IzbrPaKreisiJ() {
if (flank == 0) {
analogWrite(MotL_en, 150);
analogWrite(MotK_en, 96);
if (gaidisana2 < 900) {
gaidisana2 = gaidisana2 + 1;
digitalWrite(MotL_D1, HIGH);
digitalWrite(MotL_D2, LOW);
digitalWrite(MotK_D1, LOW);
digitalWrite(MotK_D2, HIGH);
delay(1);
} else {
flank = 1;
gaidisana2 = 0;
}
}
if (flank == 1) {
analogWrite(MotL_en, 150);
analogWrite(MotK_en, 150);
if (gaidisana2 < 150) {
gaidisana2 = gaidisana2 + 1;
digitalWrite(MotL_D1, HIGH);
digitalWrite(MotL_D2, LOW);
digitalWrite(MotK_D1, HIGH);
digitalWrite(MotK_D2, LOW);
delay(1);
} else {
flank = 2;
gaidisana2 = 0;
}
}
if (flank == 2) {
analogWrite(MotL_en, 150);
analogWrite(MotK_en, 150);
if (gaidisana2 < 50) {
gaidisana2 = gaidisana2 + 1;
digitalWrite(MotL_D1, HIGH);
digitalWrite(MotL_D2, LOW);
digitalWrite(MotK_D1, LOW);
digitalWrite(MotK_D2, HIGH);
delay(1);
} else {
stav = 1;
}
}
}
void Gaida() {
if (GaidaNoSakuma == 1) {
analogWrite(MotL_en, 150);
analogWrite(MotK_en, 150);
motori_Taisni();
delay(60);
GaidaNoSakuma = 2;
}
if (GaidaNoSakuma == 2) {
analogWrite(MotL_en, 0);
analogWrite(MotK_en, 0);
motori_STOP();
if (gaidisana < 1900) {
gaidisana = gaidisana + 1;
delay(1);
} else {
analogWrite(MotL_en, 70);
analogWrite(MotK_en, 70);
motori_Taisni();
delay(40);
gaidisana = 0;
}
}
}
void gaida_kruta() {
if (GaidaNoSakuma == 1) {
analogWrite(MotL_en, 150);
analogWrite(MotK_en, 150);
if (gdelays < 150) {
motori_Taisni();
delay(1);
gdelays = gdelays + 1;
} else {
gdelays = 0;
GaidaNoSakuma = 2;
}
}
if (GaidaNoSakuma == 2) {
analogWrite(MotL_en, 0);
analogWrite(MotK_en, 0);
motori_STOP();
if (gaidisana < 1000) {
gaidisana = gaidisana + 1;
delay(1);
} else {
gaidisana = 0;
gdelays = 0;
GaidaNoSakuma = 3;
}
}
if (GaidaNoSakuma == 3) {
analogWrite(MotL_en, 150);
analogWrite(MotK_en, 150);
if (gdelays < 150) {
motori_Taisni();
delay(1);
gdelays = gdelays + 1;
} else {
gdelays = 0;
GaidaNoSakuma = 4;
}
}
if (GaidaNoSakuma == 4) {
analogWrite(MotL_en, 0);
analogWrite(MotK_en, 0);
motori_STOP();
if (gaidisana < 1900) {
gaidisana = gaidisana + 1;
delay(1);
} else {
analogWrite(MotL_en, 70);
analogWrite(MotK_en, 70);
motori_Taisni();
delay(40);
gaidisana = 0;
}
}
}
void gaida_iebrauc() {
if (GaidaNoSakuma == 1) {
analogWrite(MotL_en, 150);
analogWrite(MotK_en, 150);
if (gdelays < 300) {
motori_Taisni();
delay(1);
gdelays = gdelays + 1;
} else {
gdelays = 0;
GaidaNoSakuma = 2;
}
}
if (GaidaNoSakuma == 2) {
analogWrite(MotL_en, 0);
analogWrite(MotK_en, 0);
motori_STOP();
if (gaidisana < 1900) {
gaidisana = gaidisana + 1;
delay(1);
} else {
analogWrite(MotL_en, 70);
analogWrite(MotK_en, 70);
motori_Taisni();
delay(40);
gaidisana = 0;
}
}
}
void bait() {
if (PiebraucPrieksa == 1) {
analogWrite(MotL_en, 250);
analogWrite(MotK_en, 250);
if (gdelays < 100) {
motori_Taisni();
delay(1);
gdelays = gdelays + 1;
} else {
gdelays = 0;
PiebraucPrieksa = 2;
}
}
if (PiebraucPrieksa == 2) {
analogWrite(MotL_en, 250);
analogWrite(MotK_en, 250);
if (gdelays < 100) {
motori_PaKreisi();
delay(1);
gdelays = gdelays + 1;
} else {
gdelays = 0;
PiebraucPrieksa = 3;
}
}
if (PiebraucPrieksa == 3) {
analogWrite(MotL_en, 200);
analogWrite(MotK_en, 200);
if (gdelays < 200) {
motori_Taisni();
delay(1);
gdelays = gdelays + 1;
} else {
gdelays = 0;
PiebraucPrieksa = 4;
}
}
if (PiebraucPrieksa == 4) {
analogWrite(MotL_en, 200);
analogWrite(MotK_en, 200);
if (gdelays < 300) {
motori_atpakl();
delay(1);
gdelays = gdelays + 1;
} else {
PiebraucPrieksa = 5;
gaidisana = 0;
}
}
if (PiebraucPrieksa == 5) {
analogWrite(MotL_en, 0);
analogWrite(MotK_en, 0);
motori_STOP();
if (gaidisana < 1900) {
gaidisana = gaidisana + 1;
delay(1);
} else {
analogWrite(MotL_en, 70);
analogWrite(MotK_en, 70);
motori_Taisni();
delay(40);
gaidisana = 0;
}
}
}
void radars() {
if (GaidaNoSakuma == 1) {
analogWrite(MotL_en, 150);
analogWrite(MotK_en, 150);
if (gdelays < 300) {
motori_Taisni();
delay(1);
gdelays = gdelays + 1;
} else {
gdelays = 0;
GaidaNoSakuma = 2;
}
}
if (GaidaNoSakuma == 2) {
if (gdelays < 400) {
motori_PaKreisi();
delay(1);
gdelays = gdelays + 1;
} else
GaidaNoSakuma = 0;
}
}
**void karogs_nolaid() {**
** myservo1.write(180); // tell servo to go to position in variable 'pos'**
** karogs = 1;**
**}**
I have bolded all the code that is for my servo
well it seem i have bolded but put them in stars ** **
How was this software built? All at one time? I have ideas....
Which parts don't work? What do they do and what are they expected to do?
Reply #2 urges You to post the wiring. Please do that.
The Servo library uses Timer 1. This disables analogWrite on pins 9 an 10, which you are using.
Is there an alternative to the that?
do you want it like a electronic or the physical picture
Reply #9 contains 3 parts but You only react on one of them.
Very often pen and paper can create schematics, if that's what Your question is about.
What do you mean by how was it built?
Your project looks like connecting everything and the codeing? Correct?
Developing large systems calls for adding hardware and coding one piece at the time. Then the next hardware part is added and coded.
Well the code is for a mini sumo robot. The servo is like a flag that comes down I recently wanted to add it and it somehow dosent let the motors work.a s MicroBahner said the libary stop D9 and D10 from working and maybe thats why because d9 and d10 are for the motor driver. Anyone know a fix?
I found the solution it was the pwm pin using from the libaray and I found a fix from a older forum
int servoPin = 7; // Control pin for servo motor
int minPulse = 544; // Minimum servo position
int maxPulse = 2400; // Maximum servo position
void setup() {
pinMode(servoPin, OUTPUT); // Set servo pin as an output pin
}
void loop() {
turnServo(45);
delay(3000);
turnServo(90);
delay(3000);
turnServo(135);
}
void turnServo(int value)
{
if(value < 0) value = 0;
if(value > 180) value = 180;
value = map(value, 0, 180, minPulse, maxPulse);
for(int i=0;i<25;i++) {
digitalWrite(servoPin, HIGH); // Turn the motor on
delayMicroseconds(value); // Length of the pulse sets the motor position
digitalWrite(servoPin, LOW); // Turn the motor off
delay(20);
}
}
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.