The HC-SR04 Ultrasonic Sensor is a very affordable proximity/distance sensor that has been used mainly for object avoidance in various robotics projects . It essentially gives your Arduino eyes / spacial awareness and can prevent your robot from crashing or falling off a table. It has also been used in turret applications, water level sensing, and even as a parking sensor. This simple project will use the HC-SR04 sensor with an Arduino and a Processing sketch to provide a neat little interactive display on your computer screen.
Parts Required: Freetronics Eleven or any compatible Arduino. HC-SR04 Ultrasonic Sensor Mini Breadboard 4.5cm x 3.5cm Protoshieldand female header pins (not essential - but makes it more tidy) Wiresto connect it all together
/* HC-SR04 Ping distance sensor: VCC to arduino 5v GND to arduino GND Echo to Arduino pin 7 Trig to Arduino pin 8 This sketch originates from Virtualmix: http://goo.gl/kJ8Gl Has been modified by Winkle ink here: http://winkleink.blogspot.com.au/2012/05/arduino-hc-sr04-ultrasonic-distance.html And modified further by ScottC here: http://arduinobasics.blogspot.com.au/2012/11/arduinobasics-hc-sr04-ultrasonic-sensor.html on 10 Nov 2012. */
int maximumRange = 200; // Maximum range needed int minimumRange = 0; // Minimum range needed long duration, distance; // Duration used to calculate distance
void setup() { Serial.begin (9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(LEDPin, OUTPUT); // Use LED indicator (if required) }
void loop() { /* The following trigPin/echoPin cycle is used to determine the distance of the nearest object by bouncing soundwaves off of it. */ digitalWrite(trigPin, LOW); delayMicroseconds(2);
//Calculate the distance (in cm) based on the speed of sound. distance = duration/58.2;
if (distance >= maximumRange || distance <= minimumRange){ /* Send a negative number to computer and Turn LED ON to indicate "out of range" */ Serial.println("-1"); digitalWrite(LEDPin, HIGH); } else { /* Send the distance to the computer using Serial protocol, and turn LED OFF to indicate successful reading. */ Serial.println(distance); digitalWrite(LEDPin, LOW); }
/* The following Processing Sketch was created by ScottC on the 10 Nov 2012 : http://arduinobasics.blogspot.com/ Inspired by this Processing sketch by Daniel Shiffman: http://processing.org/learning/basics/sinewave.html */ import processing.serial.*;
int numOfShapes = 60; // Number of squares to display on screen int shapeSpeed = 2; // Speed at which the shapes move to new position // 2 = Fastest, Larger numbers are slower
//Global Variables Square[] mySquares = new Square[numOfShapes]; int shapeSize, distance; String comPortString; Serial myPort;
/* -----------------------Setup ---------------------------*/ void setup(){ size(displayWidth,displayHeight); //Use entire screen size. smooth(); // draws all shapes with smooth edges.
/* Calculate the size of the squares and initialise the Squares array */ shapeSize = (width/numOfShapes); for(int i = 0; i<numOfShapes; i++){ mySquares[i]=new Square(int(shapeSize*i),height-40); }
/*Open the serial port for communication with the Arduino Make sure the COM port is correct - I am using COM port 8 */ myPort = new Serial(this, "COM8", 9600); myPort.bufferUntil('\n'); // Trigger a SerialEvent on new line }
/* ------------------------Draw -----------------------------*/ void draw(){ background(0); //Make the background BLACK delay(50); //Delay used to refresh screen drawSquares(); //Draw the pattern of squares }
/* Use the distance received by the Arduino to modify the y position of the first square (others will follow). Should match the code settings on the Arduino. In this case 200 is the maximum distance expected. The distance is then mapped to a value between 1 and the height of your screen */ distance = int(map(Integer.parseInt(comPortString),1,200,1,height)); if(distance<0){ /*If computer receives a negative number (-1), then the sensor is reporting an "out of range" error. Convert all of these to a distance of 0. */ distance = 0; } } }
/* Set the Y position of the 1st square based on sensor value received */ mySquares[0].setY((height-shapeSize)-distance);
/* Update the position and colour of each of the squares */ for(int i = numOfShapes-1; i>0; i--){ /* Use the previous square's position as a target */ targetY=mySquares[i-1].getY(); oldY=mySquares[i].getY();
if(abs(oldY-targetY)<2){ newY=targetY; //This helps to line them up }else{ //calculate the new position of the square newY=oldY-((oldY-targetY)/shapeSpeed); } //Set the new position of the square mySquares[i].setY(newY);
/*Calculate the colour of the square based on its position on the screen */ blueVal = int(map(newY,0,height,0,255)); redVal = 255-blueVal; fill(redVal,0,blueVal);
/* Draw the square on the screen */ rect(mySquares[i].getX(), mySquares[i].getY(),shapeSize,shapeSize); } }
/* ---------------------sketchFullScreen---------------------------*/ // This puts processing into Full Screen Mode boolean sketchFullScreen() { returntrue; }
/* ---------------------CLASS: Square ---------------------------*/ classSquare{ int xPosition, yPosition;
Have you ever wondered if there was a way to store and retrieve data from a USB stick with an Arduino UNO? Most people choose SD cards to store their project data, but you may be surprised there IS a way! IC Station have a nice little module which allows you store and retrieve your Arduino (or other MCU) project data to a USB stick. I am not too sure why USB storage is not widely used in Arduino projects? These modules are not expensive, they have been around for quite a while, and are relatively simple to use. You do not need any libraries to get them to work, however, I must say that documentation for this module is not that easy to find. This site and this document proved to be very useful in my endevour to get this module working, and I hope my tutorial below will help you get started and bridge some of the information gaps. The...
Introduction Nextion is a programmable human machine interface (HMI) that can be customized and designed to simplify the interaction between you and your project. This Nextion Enhanced module (NX4827K043) with a resistive touch screen display, has some additional features not seen in previous traditional versions of the Nextion series. A built in real time clock (RTC) Accessible flash memory (32MB) GPIO functionality Faster clock speed Before you connect the Nextion Enhanced module to your project, you need to design your interface with the free Nextion Editor. The editor can be downloaded here. In this project, I will be designing a simple dynamic interface, which will allow me to interact with a stepper motor in two different ways. The first interface will let me control the direction and speed of the stepper motor through the use of a simple GUI. I will have left and right arrows for the direction, and up and down arrows for the speed. I will also map the Expansion board...
PART THREE If you happened to land on this page and missed PART ONE , and PART TWO , I would advise you go back and read those sections first. This is what you'll find in partone : Downloading and setting up the Android SDK Downloading the Processing IDE Setting up and preparing the Android device Running through a couple of Processing/Android sketches on an Andoid phone. This is what you will find in part two : Introducing Toasts (display messages) Looking out for BluetoothDevices using BroadcastReceivers Getting useful information from a discovered Bluetooth device Connecting to a Bluetooth Device An Arduino Bluetooth Sketch that can be used in this tutorial InputStream and OutputStream We will now borrow some code from the Android developers site to help us to establish communication between the Android phone and the Bluetooth shield on the Arduino. By this stage we have already scanned and discovered the bluetooth device and made a successful connection. We now need to create ...
Comments
Post a Comment