0

Arduino tečaj: naredbe

3. lesson

Ovo je dio cjelovitog tečaja Arduino-a.
  1. Štampajte dijelove koristeći ovaj Sketchup model RescueLine.zip.
  2. Sastavite robota koristeći upute za sastavljanje.
  3. Spojite kablove koristeći plan spajanja.
  4. Programirajte robota.
    1. Osnove.
    2. Praćenje crte.
    3. Naredbe (ova stranica).
    4. LIDARi.
    5. Prekidač, IMU, 8x8 LED.
    6. Praćenje zida.
    7. Srebro.
    8. 8x8 LED programiranje.
    9. Robotska ruka.
    10. Raspberry Pi.
    11. Prepoznavanje kamerom, OpenCV.
    12. Arduino i RPI surađuju.

Commands

Having an action started right after power-up is clumsy. Often You like to have more choices. Therefore, we introduce commands here, issued using a PC or a mobile phone. By entering a chosen shortcut, You can run a selected action, interrupt it, choose another, etc.

Enter again the orange changes. They mostly consist of "&Serial2" additional parameters to constructors of sensors and motor objects. If You do not understand what "&" means, it doesn't matter. If You would like to know more, study C/C++ "address of" operator. These changes will start Bluetooth communication and all the functions in used ML-R libraries will send messages both to the screen of You computer and to mobile phone (via Bluetooth).

#include <Commands.h> //ML-R library You use to issue commands to Your robot.
#include <Motors.h> //Library Motors will be used. It contain motor-control functions.
#include <PID.h> //Library that implements a very simple proportional–integral–derivative controller. Check Wikipedia.
#include <ReflectanceSensors.h>

Commands commands(&Serial2); // Object for commands is created.
Motors motors(true, &Serial2); //motors is an C++ object of class Motors. If You do not understand this, never mind. Just alwasys use motors with this line.
PID pidLine(20, 15, 0.01, &Serial2); //PID object: pidLine. After studying Wikipedia, alter the 3 parameters.
ReflectanceSensors reflectanceSensors(0, 0.25, &Serial2);

void setup() {
  Serial.begin(115200);    // Serial (USB) communication to our computer is established. You call function begin of the object Serial with 1 argument: 115200.
  Serial2.begin(9600);        // Start serial communication with Bluetooth adapter.
  delay(1000);             // Do nothing for 1000 ms (1 sec.) - wait for the USB connection.
  Serial.println("Start"); // Display "Start" on PC's screen. Function println() prints the argument ("Start") and jumps to a new line.
  
  //The following 2 lines will create 2 commands. First parameter is shortcut that invokes the command. The second 
  //is a function pointer. Again, if that term doesn't ring a bell, it will be no problem. Just write here the name of the function You 
  //want to invoke, for example, after typing "lin" in your mobile phone. The third parameter is an explanation.
  commands.add("cal", calibrate, "Calibrate");
  commands.add("lin", line, "Follow line");

  //In the following 4 lines we will add 4 motors. First 2 parameters, numbers (like 3, 5), are pins that are connected
  //to motor controller. Third parameter (true or false) is true when it is a left motor, otherwise false. There is an optional fourth parameter in the
  //first 2 lines and there can be even more of them. Optional (default) parameters do not have to be mentioned.
  motors.add(3, 5, true, true);
  motors.add(23, 4, false);
  
  //10 reflectance sensors will be added. ML-R libraries always include new elements (like sensors and motors) using the function add().
  //First parameter is analog pin's name, second millimeters from the central longitudinal axis (negative numbers for left sensors).
  //The last parameter is always true and enables that sensor for the libary's line following algorithm.
  reflectanceSensors.add(A11, -49.5, true); 
  reflectanceSensors.add(A10, -38.5, true);
  reflectanceSensors.add(A13, -27.5, true);
  reflectanceSensors.add(A12, -16.5, true);
  reflectanceSensors.add(A1, -5.5, true);
  reflectanceSensors.add(A14, 5.5, true);
  reflectanceSensors.add(A0, 16.5, true);
  reflectanceSensors.add(A2, 27.5, true);
  reflectanceSensors.add(A17, 38.5, true);
  reflectanceSensors.add(A15, 49.5, true);
  reflectanceSensors.eepromRead();//Reading EEPROM calibration data into RAM.
}

void loop() {
//List all the available commands and wait for user's input.
  do {
    commands.list();
  } while (commands.prompt());
}

/**Function for reflectance sensors calibration
*/
bool calibrate() {
	reflectanceSensors.calibrate();
	return true;
}

/** A line-following function, can invoked by a command.
*/
bool line(){
  bool found, nonLineFound;
  //The following function returns position of the black line against the longitudinal centre of the robot. found and notFound are output
  //parameters. found is true if a line is found (at least one sensor black). nonLineFound not found (that at least one sensor doesn't detect black).
  float centerMm = reflectanceSensors.findLine(found, nonLineFound);
  //centerMm is in fact error in line following. It should be 0. PID algorithm uses it as an input and calculates error correction:
  float correction = pidLine.calculate(centerMm);

  const int speedAhead = 60; //Average speed of the left and right motor. You can change this number.
  if (found)
    motors.go(speedAhead + correction, speedAhead - correction);//Here we control the motors.
  else
    motors.go(50, 50); //If no line, go straight ahead.
  return true;
}

/**All the ML-R libraries invoke this function when something goes wrong. Here we stop the motors, display the error
message which enters the function as the only argument ("message") and then enter an endless loop. while(1) never ends as the condition
(1) is always true. The only command that is in the loop is ";" (empty command - does nothing).
@param message*/
void error(String message){
  motors.go(0, 0);         //stop the motors to avoid harm
  Serial.println(message); //display error message
  while(1)                 //never stop
    ;                      //do nothing
}

Run the program and watch the result:



Do not pay attention to EEPROM-related lines yet. The last line lists all the commands You entered (2 of them). You would normally want to have many commands. 50 or 100 is not unusual. If there are so many of them, You will have to group them in submenues, but we will not discuss this topic right now. The action we need the most now is reflectance sensors' calibration. Get ready a white surface with a black line on it. In the top area of the monitor enter Your command's shortcut, in our case "cal", and press "Send":



During the next few seconds move the robot over the black line, with wheels touching the surface (robot's natural position). The sensors' row must be perpendicular to the line (again the natural position) and You have to move the robot all the way to the left and to to right, so that all the sensors experience both black and white. Soon the monitor will show:



The lines starting with "Writing..." are important. The dark values must be a few hunderts smaller than bright values. If so, the calibration will be all right.

For this step You have to have a mobile phone that can establish a link to an arbitrary Bluetooth device. Andoid works fine. If You own an iPhone, You are not so lucky. Download "Blueterm 2" application or any similar Bluetooth terminal. Pair Your phone with the robot's Bluetooth adapter. Start Blueterm 2. Now all the commands can be entered using You phone. Enter the command and the robot will obey. You should try "lin" and ... the robot should follow the line!

Previous lesson
Next lesson