Go Down

Topic: HELP ME ! waveshield servo and a sonar ... i need help in organizing codes (Read 941 times) previous topic - next topic


I connected a wave shield a sonar and a servo, i changed the library of the servo since it made a conflict with the waveshield in the Timer1 and it worked fine in a separated code .. when i combined the waveshield and the servo_sonar code in the code below i couldnt track the sonar on the serial monitor and the servo just made a very tiny and random moves

Can you help me please!

Code: [Select]
#include <NewPing.h>
#include <SoftwareServo.h>
#include <FatReader.h>
#include <SdReader.h>
#include <avr/pgmspace.h>
#include "WaveUtil.h"
#include "WaveHC.h"

#define TRIGGER_PIN  12  // Arduino pin tied to trigger pin on ping sensor.
#define ECHO_PIN     11  // Arduino pin tied to echo pin on ping sensor.
#define MAX_DISTANCE 500 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.

SoftwareServo servo1;

SdReader card;    // This object holds the information for the card
FatVolume vol;    // This holds the information for the partition on the card
FatReader root;   // This holds the information for the filesystem on the card
FatReader f;      // This holds the information for the file we're play

WaveHC wave;      // This is the only wave (audio) object, since we will only play one at a time

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.

//Servo myservo1;

unsigned int pingSpeed = 500; // How frequently are we going to send out a ping (in milliseconds). 50ms would be 20 times a second.
unsigned long pingTimer;     // Holds the next ping time.

// here is where we define the buttons that we'll use. button "1" is the first, button "6" is the 6th, etc

byte buttons [] = { A0, A1, A2, A3, A4, A5};
// This handy macro lets us determine how big the array up above is, by checking the size
#define NUMBUTTONS sizeof(buttons)
// we will track if a button is just pressed, just released, or 'pressed' (the current state

// this handy function will return the number of bytes currently free in RAM, great for debugging!   
int freeRam(void)
  extern int  __bss_end;
  extern int  *__brkval;
  int free_memory;
  if((int)__brkval == 0) {
    free_memory = ((int)&free_memory) - ((int)&__bss_end);
  else {
    free_memory = ((int)&free_memory) - ((int)__brkval);
  return free_memory;

void sdErrorCheck(void)
  if (!card.errorCode()) return;
  putstring("\n\rSD I/O error: ");
  Serial.print(card.errorCode(), HEX);
  putstring(", ");
  Serial.println(card.errorData(), HEX);

void setup() {
   Serial.begin(115200); // Open serial monitor at 115200 baud to see ping results.
  pingTimer = millis(); // Start now.

//  myservo1.attach(3);

  byte i;
  int analogRead = (0);
  // set up serial port
  putstring_nl("WaveHC with ");
  Serial.print(NUMBUTTONS, DEC);
  putstring("Free RAM: ");       // This can help with debugging, running out of RAM is bad
  Serial.println(freeRam());      // if this is under 150 bytes it may spell trouble!
  // pin13 LED
  pinMode(13, OUTPUT);

//    if (!card.init(true)) { //play with 4 MHz spi if 8MHz isn't working for you
  if (!card.init()) {         //play with 8 MHz spi (default faster!) 
    putstring_nl("Card init. failed!");  // Something went wrong, lets print out why
    while(1);                            // then 'halt' - do nothing!
  // enable optimize read - some cards may timeout. Disable if you're having problems

// Now we will look for a FAT partition!
  uint8_t part;
  for (part = 0; part < 5; part++) {     // we have up to 5 slots to look in
    if (vol.init(card, part))
      break;                             // we found one, lets bail
  if (part == 5) {                       // if we ended up not finding one  :(
    putstring_nl("No valid FAT partition!");
    sdErrorCheck();      // Something went wrong, lets print out why
    while(1);                            // then 'halt' - do nothing!
  // Lets tell the user about what we found
  putstring("Using partition ");
  Serial.print(part, DEC);
  putstring(", type is FAT");
  Serial.println(vol.fatType(),DEC);     // FAT16 or FAT32?
  // Try to open the root directory
  if (!root.openRoot(vol)) {
    putstring_nl("Can't open root dir!"); // Something went wrong,
    while(1);                             // then 'halt' - do nothing!


void loop() {
   // Notice how there's no delays in this sketch to allow you to do other processing in-line while doing distance pings.
  if (millis() >= pingTimer) {   // pingSpeed milliseconds since last ping, do another ping.
    pingTimer += pingSpeed;      // Set the next ping time.
    sonar.ping_timer(echoCheck); // Send out the ping, calls "echoCheck" function every 24uS where you can check the ping status.
   if ((sonar.ping_result / US_ROUNDTRIP_CM) < 50){
//    myservo1.write(90);
   else {
//    myservo1.write(0);

  byte i;
  static byte playing = -1;
  int sensor0 = analogRead (buttons [0]);
  int sensor1 = analogRead (buttons [1]);
  int sensor2 = analogRead (buttons [2]);
  int sensor3 = analogRead (buttons [3]);
  int sensor4 = analogRead (buttons [4]);
  int sensor5 = analogRead (buttons [5]);
  Serial.print("LDR A0=");   
  if ( analogRead (buttons [0]) > 900) {
    if (playing != 0) {
      playing = 0;
  Serial.print("LDR A1="); 
if ( analogRead (buttons [1]) > 900) {
    if (playing != 0) {
      playing = 0;
  Serial.print("LDR A2="); 
   if ( analogRead (buttons [2]) > 900) {
    if (playing != 0) {
      playing = 0;
    Serial.print("LDR A3="); 
  if ( analogRead (buttons [3]) > 150) {
    if (playing != 0) {
      playing = 0;
  Serial.print("LDR A4="); 
   if ( analogRead (buttons [4]) > 150) {
    if (playing != 0) {
      playing = 0;
  Serial.print("LDR A5="); 
  if ( analogRead (buttons [5]) > 150) {
    if (playing != 0) {
      playing = 0;
  if (! wave.isplaying) {
    playing = -1;

// Plays a full file from beginning to end with no pause.
void playcomplete(char *name) {
  // call our helper to find and play this name
  while (wave.isplaying) {
  // do nothing while its playing
  // now its done playing

void playfile(char *name) {
  // see if the wave object is currently doing something
  if (wave.isplaying) {// already playing something, so stop it!
    wave.stop(); // stop it
  // look in the root directory and open the file
  if (!f.open(root, name)) {
    putstring("Couldn't open file "); Serial.print(name); return;
  // OK read the file and turn it into a wave object
  if (!wave.create(f)) {
    putstring_nl("Not a valid WAV"); return;
  // ok time to play! start playback

  void echoCheck() { // Timer2 interrupt calls this function every 24uS where you can check the ping status.
  // Don't do anything here!
  if (sonar.check_timer()) { // This is how you check to see if the ping was received.

    Serial.print("Ping: ");
    Serial.print(sonar.ping_result / US_ROUNDTRIP_CM); // Ping returned, uS result in ping_result, convert to cm with US_ROUNDTRIP_CM.

  // Don't do anything here!



i changed the library of the servo

And, we're supposed to guess what you changed? I'll pass.

Code: [Select]
  int analogRead = (0);
(Is) (there) (some) (reason) (for) (the) (parentheses) (?)

Code: [Select]
You need to call this on every pass through loop, not just now and then.

The art of getting good answers lies in asking good questions.


i said that the servo and the waveshield made a conflict in the timer1 so i changed the library <servo.h> to <SoftwareServo.h>

i called the servo twice and sorry it doesnt appear in the above code .. but still it didnt work


i called the servo twice

What does this mean? If you changed your code, post it again.
The art of getting good answers lies in asking good questions.

Go Up

Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

via Egeo 16
Torino, 10131