Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Table of Contents

* updated 


03.06.15 - Update: The Ultrasonic Problem

Measuring distances with an ultrasonic sensor poses an unexpected challenge - dealing with the speed of sonic.

The HC-SR04 waits for a 10µs HIGH signal on the Trig-pin, then generates an ultrasonic pulse and starts listening for it's echo to return. While listening the sensor sets the Echo-pin on HIGH, so a negative edge to LOW on this pin means that the echo has returned.

Detecting an obstacle's distance basically means measuring the time from the pulse's generation to its echo's return, in other words measuring the time the Echo-pin is on HIGH, and afterwards calculate the distance with the help of sonic speed:

distance = time / 2 * sonic_speed                (1)

The division by two is done because the sonic has traveled two times the way to the obstacle. Sonic speed "in dry air of a temperature of 20 °C (68 °F) at sea level [...] is approximately 343.2 m/s"1 which we can translate into µs/cm:

343.2m/s = (1/343.2)s/m = 2913µs/m = 29.1µs/cm   (2)

This brings us to the usually used form:

distance(cm) = (duration(µs) / 2) / 29.1(µs/cm)  (3)

 

Expand
titleClick here for old version...


There exist several approaches to

To implement such behavior

with all using time stamps before and after the measurement:The most simple approach is to

the usual approach is to just trigger one sensor after another and wait for the negative edge each. 

This can be realized like this:

Code Block
languagecpp
// for each sensor {
      long duration, distance;
      digitalWrite(trigPin, HIGH);
      delayMicroseconds(10);
      digitalWrite(trigPin, LOW);
      duration = pulseIn(echoPin, HIGH);
      distance = (duration/2) / 29.1;
// }

The pulseIn function is a blocking function, which means that the processor has to wait until former has finished. 
Lets assume the quadcopter is somewhere in the middle of a large room and neglect the distance to the ground and ceiling. The Arduino has to measure the proximity of eight sensors. In the equation (2) we can see that the sonic needs 2.9ms per meter. A distance of two meters in all directions can add up to 8 * 2 * 2m * 2.9ms = 92.8ms. With three meters distance it'll take a time of approximately 8 * 2 * 3m * 2.9ms = 139.2ms.

This measurement cannot be done by the main Arduino, because the tick times would be much

to

too long for the balancing and other safety

aspects

critical operations

A much worse problem is that the pulseIn function waits up to three minutes without returning and gives no possibility to lower this value, so in case the sensor points in an unfavorable direction the acoustic waves could reflect somehow and not return to the sensor. Although while flight this should be extremely rare, there is a potential chance of long lags in the program, which is unacceptable.

To handle these issues the developer Tim Eckel wrote his NewPing Library for Arduino and provided it under GNU GPL v3 license. 

Code Block
languagecpp
#include <NewPing.h>
#define TRIGGER_PIN_1 12
#define ECHO_PIN_1 11
#define TRIGGER_PIN_2 10
#define ECHO_PIN_2 9
#define MAX_DISTANCE 200
NewPing sonar1(TRIGGER_PIN_1, ECHO_PIN_1, MAX_DISTANCE);
NewPing sonar2(TRIGGER_PIN_2, ECHO_PIN_2, MAX_DISTANCE);
#define pingSpeed 100 // Ping frequency (in milliseconds), fastest we should ping is about 35ms per sensor
#define printSpeed 1000
unsigned long pingTimer1, pingTimer2, printTimer;
unsigned int uS1, uS2;
void setup() {
  Serial.begin(9600);
  pingTimer1 = millis() + pingSpeed;
  pingTimer2 = pingTimer1 + (pingSpeed / 2);
  printTimer = millis() + printSpeed;
}
void loop() {
  if (millis() >= pingTimer1) {
    pingTimer1 += pingSpeed;
    uS1 = sonar1.ping();
  }
  if (millis() >= pingTimer2) {
    pingTimer2 = pingTimer1 + (pingSpeed / 2);
    uS2 = sonar2.ping();
  }
   
  if (millis() >= printTimer) {
    printTimer += printSpeed;
    
    Serial.print("Ping1: ");
    Serial.print(sonar1.convert_cm(uS1));
    Serial.println("cm");
   
    Serial.print("Ping2: ");
    Serial.print(sonar2.convert_cm(uS2));
    Serial.println("cm");
  }
  
}

 

 

Source: http://stm32f4-discovery.com/

1 http://en.wikipedia.org/wiki/Supersonic_speed

02.06.15 - Update: First Movements

 


28.05.15 - Meeting

Start:16:00 Attendees:
End:

17:00

 

apo

fma

lan

lpe

Protocol:fma (tick)(tick)(tick) 

Click here for details...

 


21.05.15 - Meeting

Start:16:00 Attendees:
End:

17:00

 

apo

fma

lan

lpe

Protocol:apo (tick) (tick) 

Click here for details...

 


13.05.15 - Update*

For providing the ability of using the real sensors and actuators as well as the simulation to test the quadcopter, we decided to use some interface, which can both, communicate with the hardware or with the simulation.

Update (16.05.15):

A basic Arduino Sketch with description is published under the Software section, outlining all current challenges of the projects code.

 


12.05.15 - Update

Since the components are shipped with an unknown arrival date and for testing the interaction of the different sensors and actuators we will build an Arduino Lego Mindstorms setup on three wheels.

The NXT will therefor provide some basic navigation functions like goForwards, goBackwards, rotateRight, etc., as the software for basic flight is going to do later, too, and control the motors accordingly. The Arduino will be connected to the rest of existing components as usual. 

An NXT block is generally able to communicate over I2C as master to any slave device, for instance the Arduino. Via simple looped polling the NXT can ask the Arduino for drive commands.

To connect the Lego block to the Arduino a Mindstorms NXT cable is ordered, which will be cut open and linked to the microcontroller. For further understanding about wiring and I2C the LEGO MINDSTORMS NXT Hardware Developer Kit.pdf gives a good start. In addition the webpages of leJOS News and Dexter Industries seem to be quite helpful and even give some basic code example. Further information following...

 


11.05.15 - Update*

Ultrasonic sensors and bluetooth bridge have been delivered. Communication with Arduino is working.

Code:

Code Block
languagec#
titleThe Arduino can detect the measured distance of a sensor and print it to the console
linenumberstrue
collapsetrue
/*
 * code partly from http://www.robodino.de/2011/12/ultraschall-distanz-sensor-hc-sr04.html
 */ 
 
#define trigPin 31
#define echoPin 33
 
void setup() {
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}
 
void loop() {
  long duration, distance;
  // To trigger the sensor a 10us HIGH signal is needed.
  // Create definite LOW for 2us 
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  // Give it a HIGH for 10us
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  // LOW again
  digitalWrite(trigPin, LOW);
  // Measure the pulse width of the incoming signal
  duration = pulseIn(echoPin, HIGH);
  // Calculate the distance with given function
  distance = (duration/2) / 29.1;

 
  if (distance >= 400 || distance <= 0) {
    Serial.println("Out of range");
  }
  else {
    Serial.print(distance);
    Serial.println(" cm");
  }
  // Wait a microsecond to start again
  delay(1);
}
Code Block
languagec#
titleThe Arduino can receive command via bluetooth and set an LED on or off
linenumberstrue
collapsetrue
/*
 * code partly from http://www.arduino-hacks.com/adding-bluetooth-capability-project-arduino-hc-06/
 */
 
char blueToothVal;           
 
void setup() {
  // Start a bluetooth connection via Serial1 ports
  Serial.begin(9600); 
  // User the LED on pin 13
  pinMode(13,OUTPUT);
}
 
void loop() {
  // If data over Serial1 are received
  if(Serial.available()>0) {
    // Read the data
    blueToothVal=Serial.read();
  }
  // If the data equal the letter 'n'
  if (blueToothVal=='n') {
    // Switch LED on
    digitalWrite(13,HIGH);
  }
  // Else if the data equal the letter 'f'
  else if (blueToothVal=='f') {
    // Switch LED off
    digitalWrite(13,LOW);
  }
  // Wait 100ms
  delay(100);
}
Code Block
languagec#
titleA computer can connect wirelessly to the Arduino and get the measured distance via bluetooth terminal
linenumberstrue
collapsetrue
#define trigPin 31
#define echoPin 33
char blueToothVal;
 
void setup() {
 Serial.begin(9600); 
 pinMode(trigPin, OUTPUT);
 pinMode(echoPin, INPUT);
}
 
long getDistance() {
  long duration, distance;
  digitalWrite(13,HIGH);
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1;
  
  if (distance >= 400 || distance <= 0){
      distance = getDistance();
  }
  
  return distance;
}
 
 
void loop() {
  
  if(Serial.available()>0) {
    blueToothVal=Serial.read();
  }
  if (blueToothVal=='x') {
    Serial.print(getDistance());
    Serial.println(" cm");
  }
 
  // Reset blueToothVal to any letter but 'x'
  blueToothVal = 'c';
  delay(100);
}

The bluetooth module is found on the MacBook Pro as HC-06 in the list of available bluetooth devices. A connection can be established with Code '1234'.

 

Expand
titleClick here to show screen approach...

In Terminal a list of all open serial ports can be shown via ' ls /dev/tty.* '.

/dev/tty.HC-06-DevB ' should be shown in the list. A serial console to the module can be established via ' screen /dev/tty.HC-06-DevB '.

Update:

To kill a running screen, press ctrl-a, afterwards crtl-\ (Yes: on German keyboard: ctrl-alt-shift-7), afterwards y.

 

Unfortunately the MacBook does not reconnect automatically after reset of the Arduino. The bluetooth module has to be unpaired and paired again to be usable again. Hopefully this will can be fixed somehow...

Update:

A much easier way of connecting via bluetooth is to use the Arduino Serial Monitor (Tools -> Serial Monitor).

It is now clear, how the module is handled by the MacBook Pro. Once paired, the HC-06 is always shown in the list of bluetooth devices as 'Not connected', unless an explicit connection is established. Establish a connection with a screen or the Serial Monitor. Once the connection is closed, HC-06 will be shown as 'Not connected' again. It is important to notice that the previous screen method has to be killed explicitly, not only closed, since there can only be one serial connection at once.

 


08.05.15 - Proposal Presentation

Office Powerpoint
nameProposal presentation, lpe, lan, fma.pptx

 


07.05.15 - Meeting

Start:16:00 Attendees:
End:

18:00

 

apo

fma

lan

lpe

Protocol:lan (tick)(tick)(tick)(tick)

Click here for details... 

 


30.04.15 - Meeting

Start:16:00 Attendees:
End:

16:40

 

apo

fma

lan

lpe

Protocol:lpe (tick)(tick)(tick)(tick)

Click here for details... 

 


26.04.15 - Meeting

Start:17:30 Attendees:
End:

21:00

 

apo

fma

lan

lpe

Protocol:fma (tick)(tick) (tick)

Click here for details... 

 


23.04.15 - Meeting

Start:17:30 Attendees:
End:

18:30

 

apo

fma

lan

lpe

Protocol:lpe (tick)(tick)(tick)(tick)

Click here for details...

 


23.04.15 - Meeting

Start:16:00 Attendees:
End:

17:30

 

apo

fma

lan

lpe

Protocol:lpe (tick)(tick)(tick)(tick)

Click here for details...