Go Down

Topic: Pulssilaskuri robottiin (Read 2287 times) previous topic - next topic

juipelo

Jan 22, 2017, 05:50 pm Last Edit: Jan 22, 2017, 09:35 pm by juipelo
Hei!

Kokeillaan löytyykö täältä yhtään suomalaista, kun englanti ei oikein taivu  :D

Ostin muutama viikko sitten arduinon ja olen vielä aika pihalla sen ohjelmoinnista. Perus ledin vilkuttelut, pwm säätö ja esim. akkujännitteen lukeminen vastuksien avulla onnistuu jo, mutta monimutkaisemmat jutut aiheuttavat harmaita hiuksia.


Olen yritänyt saada ohjelmoitua laskurin robottiini, joka laskee ajopulssit (induktiivinen anturi pyörässä) ja pysäyttää moottorit, kun säädettu raja ylitetään. Ongelma on se, että moottorit eivät käynnisty ennen kuin ohjelma saa anturilta "herätteen". Koodin kopion netistä ja yhdistelin. Laskurin toimintaperiaate ei oikein ole vielä avautunut. Mihin tarvitaan previousState ja currentState?


Tarkoitus olisi saada robotti (ehkä joskus ruohonleikkuri) kulkemaan seinän vieressä säädetty matka ja säädetyllä etäisyydellä. Etäisyyden mittaamiseen on etsinnässä ulkokäyttöön tarkoitettu ultraäänisensori. Onko linkittää hyviä vaihtoehtoja?

Tässä yksi http://robomaa.fi/anturit/ultrani/ultrasonic-ranger-srf485wpr-weatherproof

Kuinka tuon kytkentä toteutetaan?
Voiko perusmallin anturin suojata ilman, että toimintakyky menetetään?

Robotin käynnistys tulisi pystyä ajastamaan. Onnistuuko ilman reaaliaikakelloa?

Minulla on Sabertooth 2x32A moottorin ohjain, joka on kytketty tx pinniin.

Code: [Select]
// Tank-Style Sweep Sample for Packet Serial
// Copyright (c) 2012 Dimension Engineering LLC
// See license.txt for license details.
int ajopulssi = 5; //säädetty matka pulsseina
int anturiPin =7; //anturin pinni
int val = 0;
int counter = 0; //laskuri
int currentState = 0;
int previousState = 0;
#include <Sabertooth.h>

// Mixed mode is for tank-style diff-drive robots.

Sabertooth ST(128); // The Sabertooth is on address 128. We'll name its object ST.
                    // If you've set up your Sabertooth on a different address, of course change
                    // that here. For how to configure address, etc. see the DIP Switch Wizard for
                    //   Sabertooth - http://www.dimensionengineering.com/datasheets/SabertoothDIPWizard/start.htm
                    //   SyRen      - http://www.dimensionengineering.com/datasheets/SyrenDIPWizard/start.htm
                    // Be sure to select Packetized Serial Mode for use with this library.
                    //
                    // This sample uses the mixed mode (diff-drive) commands, which require two motors
                    // and hence do not work on a SyRen.
                    //
                    // In this sample, hardware serial TX connects to S1.
                    // See the SoftwareSerial example in 3.Advanced for how to use other pins.

void setup()
{
  pinMode(anturiPin, INPUT);
  SabertoothTXPinSerial.begin(9600); // 9600 is the default baud rate for Sabertooth packet serial.
  ST.autobaud(); // Send the autobaud command to the Sabertooth controller(s).
                 // NOTE: *Not all* Sabertooth controllers need this command.
                 //       It doesn't hurt anything, but V2 controllers use an
                 //       EEPROM setting (changeable with the function setBaudRate) to set
                 //       the baud rate instead of detecting with autobaud.
                 //
                 //       If you have a 2x12, 2x25 V2, 2x60 or SyRen 50, you can remove
                 //       the autobaud line and save yourself two seconds of startup delay.
            
  ST.drive(0); // The Sabertooth won't act on mixed mode packet serial commands until
  ST.turn(0);  // it has received power levels for BOTH throttle and turning, since it
               // mixes the two together to get diff-drive power levels for both motors.          
}
void loop()
{
  int power;
  val = digitalRead(anturiPin);
if (val == HIGH) {
currentState = 1;
}
else {
currentState = 0;
}
if(currentState != previousState){
if(currentState == 1){
counter = counter + 1;
}
  if (counter < ajopulssi){
  for (power = 0; power <= 127; power ++)
  {
    ST.drive(power);
    delay(20);
  }
}
  else {
  ST.drive(0);
  }
}
previousState = currentState;
delay(10);
}





Go Up