Arduino Polska Forum

Pełna wersja: Sterowanie serwomechanizmamy Arduino+Bluetooth+Android
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Stron: 1 2
Witam

Na projekt mam do wykonania sterowanie bluetooth 6 serwami.
Problem mój polega na tym że te serwa sterują manipulatorem i istotne jest dla mnie to by każde z serwomechanizmów po uruchomieniu ustawiało się w pozycji 0. Nie wiem jak mam to zapisać w kodzie.


Użyte częsci:
Serwo MG 996r
moduł bluetooth HC-06
Arduino UNO

Poniżej kod:

Kod:
#include <SoftwareSerial.h>
#include <Servo.h> 

Servo myservo1, myservo2, myservo3, myservo4, myservo5, myservo6;      

int bluetoothTx = 8;
int bluetoothRx = 9;
int pos = 0;

SoftwareSerial bluetooth(bluetoothTx, bluetoothRx);

void setup()
{
  myservo1.attach(2);
  myservo2.attach(3);
  myservo3.attach(4);
  myservo4.attach(5);
  myservo5.attach(6);
  myservo6.attach(7);
  Serial.begin(9600);     //Setup usb serial connection to computer
  bluetooth.begin(9600);  //Setup Bluetooth serial connection to android
}

void loop()

  
  //Read from bluetooth and write to usb serial
  
   if(bluetooth.available()>= 2 )
  {
    unsigned int servopos = bluetooth.read();
    unsigned int servopos1 = bluetooth.read();
    unsigned int realservo = (servopos1 *256) + servopos; 
    Serial.println(realservo); 
    
    if (realservo >= 1000 && realservo <1180)
    {
    int servo1 = realservo;
    servo1 = map(servo1, 1000,1180,0,180);
    myservo1.write(servo1);
    Serial.println("servo 1 ON");
    delay(10);

    }
    
    if (realservo >=2000 && realservo <2180)
    {
      int servo2 = realservo;
      servo2 = map(servo2,2000,2180,0,180);
      myservo2.write(servo2);
      Serial.println("servo 2 On");
      delay(10);
    }
    
    if (realservo >=3000 && realservo < 3180)
    {
      int servo3 = realservo;
      servo3 = map(servo3, 3000, 3180,0,180);
      myservo3.write(servo3);
      Serial.println("servo 3 On");
      delay(10);
    }
    
    if (realservo >=4000 && realservo < 4180)
    {
      int servo4 = realservo;
      servo4 = map(servo4, 4000, 4180,0,180);
      myservo4.write(servo4);
      Serial.println("servo 4 On");
      delay(10);
    }
    
    if (realservo >=5000 && realservo < 5180)
    {
      int servo5 = realservo;
      servo5 = map(servo5, 5000, 5180,0,180);
      myservo5.write(servo5);
      Serial.println("servo 5 On");
      delay(10);
    }
    
    if (realservo >=6000 && realservo < 6180)
    {
      int servo6 = realservo;
      servo6 = map(servo6, 6000, 6180,0,180);
      myservo6.write(servo6);
      Serial.println("servo 6 On");
      delay(10);
    }
 
  }


}

Po raz kolejny przypominam o code
A próbowałeś dodać do setup()
Kod:
myservo1.write(0);
(29-11-2016, 19:27)namok napisał(a): [ -> ]A próbowałeś dodać do setup()
Kod:
myservo1.write(0);

Próbowałem

Efekt jest taki, że jeśli dodam to w setup() to nie będzie działać sterowanie bluetooth.
(29-11-2016, 19:38)sirmati15 napisał(a): [ -> ]
(29-11-2016, 19:27)namok napisał(a): [ -> ]A próbowałeś dodać do setup()
Kod:
myservo1.write(0);

Próbowałem

Efekt jest taki, że jeśli dodam to w setup() to nie będzie działać sterowanie bluetooth.
Zapomniałeś napisać czy serwo ustawia się w prawidłowej pozycji.
Dodałeś to przed myservo.attach()?
(29-11-2016, 19:46)namok napisał(a): [ -> ]
(29-11-2016, 19:38)sirmati15 napisał(a): [ -> ]
(29-11-2016, 19:27)namok napisał(a): [ -> ]A próbowałeś dodać do setup()
Kod:
myservo1.write(0);

Próbowałem

Efekt jest taki, że jeśli dodam to w setup() to nie będzie działać sterowanie bluetooth.
Zapomniałeś napisać czy serwo ustawia się w prawidłowej pozycji.
Dodałeś to przed myservo.attach()?


Dodałem to za myservo.attach() ok działa
Dzięki za pomoc.
Witam

Idąc dalej z tematem i złożeniem manipulatora chcę ruch serwa spowolnić. 
Zadając odpowiedni kąt przy użyciu aplikacji na androida serwo działa zbyt szybko i przy takiej dynamice dochodzi do przeregulowań. Chce uzyskać efekt w którym kliknięcie w aplikacji bluetooth wyśle informację o kącie ale programowo ten kąt zostanie podzielony co 1 stopień by nie doszło do szarpnięć.

Próbowałem w ten sposób ale niestety uklad nie działa poprawnie. Proszę o pomoc. Dodałem poniżej fragment kodu do sterowania jednym serwem przez bluetooth

Kod:
void loop()
{

 //Read from bluetooth and write to usb serial
 if(bluetooth.available()>= 2 )
 {
   unsigned int servopos = bluetooth.read();
   unsigned int servopos1 = bluetooth.read();
   unsigned int realservo = (servopos1 *256) + servopos;
   Serial.println(realservo);

   if (realservo >=2000 && realservo <2180)
   {

    int servo2 = realservo;
         servo2 = map(servo2,2000,2180,30,150);

     delay(100);
     myservo2.write(servo2 +=1);   // próba przesunięcia serwa co 1 stopień
     delay(100);
     Serial.println("servo 2 On");
     delay(100);
    }
(12-12-2016, 17:45)Automatyk napisał(a): [ -> ]http://starter-kit.nettigo.pl/2012/02/ak...uino-cz-1/

Czy konieczne jest kupowanie dodatowego sprzętu do obłsugi serw ? Nie można załatwić tego programowo ?
tu masz troszkę do myślenia , powinno pomóc

Kod:
#include <Servo.h>
byte last_x;


Servo myservo;

int pos = 0;

void setup() {
  
  myservo.attach(9);

  serwo(0,0);
  serwo(90,5);
  serwo(1,5);
  serwo(180,5);
  serwo(1,15);
  serwo(180,25);
  serwo(1,35);
  serwo(180,40);
}
  

void loop() {
}

void serwo(byte x,byte y){
  
if ( x > last_x ){
  
  for (pos = last_x; pos <= x; pos += 1) {
    myservo.write(pos);            
    delay(y);          
    }}

if ( x < last_x ){
    
  for (pos = last_x ; pos >= 0; pos -= 1) {
    myservo.write(pos);
    delay(y);
    }}
last_x = x;
    
}
Stron: 1 2