Showing posts with label Arduino. Show all posts
Showing posts with label Arduino. Show all posts

Sunday, May 16, 2010

More Arduino Reading Optical

Here's a code snippet for you, all dirty and messy. It will be cleaned up prior to inclusion in the class. Currently working on including the TSL230R Light-to-Frequency Converter with code shamelessly borrowed from:
http://roamingdrone.wordpress.com/2008/11/13/arduino-and-the-taos-tsl230r-light-sensor-getting-started/

I will probably use the code as-is. It handles this device as an interrupt process, and handling interrupts was an intention of the class.

I have this mystery phototransistor from Tanners. No datasheed can be found by several people working on int and Tanners sells the item "No data". It looks like a TO-18 case with a glass top, so I will assume that the connections are the same. It has a base pin, it would seem, which I thought was odd as I thought that that base was controlled by light. I have several, so I will experiment with a few, but I'm not sure how I will know if I have destroyed one or not. I think I may skip this one for another day and leave it out of the class.

----- Code 4 You  -------

/*
IR1
*

detects moving infrared with PIR. Upon sensing, checks light level with Light Dependent Resistor (Cadmium photocell) and then uses infrared rangefinding to determine range of object.

*/


int IRrangePin = 0; // select the input pin for the potentiometer
int inPin = 1; // select pin for IR detector (analog)
int LRpin = 2; //select analog pin for LDR
int ledPin1 = 13; // select the pin for the LED
int ledPin2 = 12; // second led
int ledPin3 = 11; // third led
int val = 0; // variable to store the value coming from the sensor
int dval = 0; // variable to store valud from IR detect
int Lval = 0; // Variable for use with LDR
int NewVal = 0; // Work variable



void setup() {
Serial.begin(9600);
Serial.println("Setup. ");
pinMode(ledPin1, OUTPUT); // declare the ledPin1 as an OUTPUT
pinMode(ledPin2, OUTPUT); // declare the ledPin2 as an OUTPUT
pinMode(ledPin3, OUTPUT); // declare the ledPin3 as an OUTPUT
pinMode(inPin, INPUT); // declare the Infrared detect pin as an INPUT
pinMode(LRpin, INPUT); // declare teh LDR pin as an INPUT
digitalWrite(ledPin3, LOW); // full on
}

void loop() {
dval=LOW;
detect();
val = analogRead(IRrangePin); // read the value from the sensor

/*
Serial.print("Proximity: "); Serial.println(val);
digitalWrite(ledPin1, HIGH); // turn the ledPin on
delay(val); // stop the program for some time
digitalWrite(ledPin1, LOW); // turn the ledPin off
*/
delay(val); // stop the program for some time
}


void detect()
{
delay(100);
dval = analogRead(inPin); // read input from IR detector
//Serial.print(dval);
if (dval>0)
{
Serial.println();
Serial.print(" Detection >YES. ");
digitalWrite(ledPin2, HIGH); // turn the ledPin on
LDR();
findRange();
}

if (dval<=0)
{
Serial.print(".");
digitalWrite(ledPin2, LOW); // turn the ledPin off
}
delay(200);
}


void LDR(){
Lval = analogRead(LRpin);
Serial.print(" LDR: "); Serial.print(Lval); Serial.print(" ");
analogWrite(ledPin3,(75+Lval));
delay(100);
}


void findRange(){
val = analogRead(IRrangePin); // read the value from the sensor
NewVal = val/100;
Serial.print("Proximity: "); Serial.print(val);

switch (NewVal) {

case 0:
//far away
Serial.print(" Too far. ");
break;
// break is optional

case 1:
//do something when var == 1
Serial.print(" Zone 1. ");
break;

case 2:
//do something when var == 2
Serial.print(" Zone 2. ");
break;

case 3:
//do something when var == 3
Serial.print(" Zone 3. ");
break;

case 4:
//do something when var == 4
Serial.print(" Zone 4. ");
break;

case 5:
//do something when var == 5
Serial.print(" Zone 5. ");
break;

case 6:
//do something when var == 6
Serial.print(" Zone 6. ");
break;

case 7:
//do something when var == 7
Serial.print(" Zone 7. ");
break;

default:
// if nothing else matches, do the default
// default is optional
Serial.print(" Unknown. ");
}

Serial.println();
digitalWrite(ledPin1, HIGH); // turn the ledPin on
delay(val); // stop the program for some time
digitalWrite(ledPin1, LOW); // turn the ledPin off
delay(val); // stop the program for some time

}

Tuesday, May 11, 2010

Arduino Reading Optical

Here is what is currently in production for the Arduino project. It is a draft and not finished work.

Reading Optical

Many optical devices are analog and not digital. The task is often to convert the response of the analog device into a more-or-less digital response. In the application of the analog devices in this segment, the analog pins on the Arduino chip will be used. Pins 0, 1 and 2 will be used. The analog pins on the Arduino read the input voltage from the device and convert into a numeric value.

The Arduino reference manual states, “This means that it will map input voltages between 0 and 5 volts into integer values between 0 and 1023. This yields a resolution between readings of: 5 volts / 1024 units or, .0049 volts (4.9 mV) per unit.”

Note that the voltages are still between 0 and 5 volts. Be careful not to fry your Arduino.

The numeric values from the analog pins may then be tested and branched using ranges of values and a case statement; an “if” structure will also work. Synthesizing digital action from an analog device merely means that the voltage has crossed a certain threshold; the number returned from the pin has passed a certain value and a test becomes true of false accordingly.

Goal

Instruct the student on input sensors- light (including optical encoder), switches and potentiometer. Optical encoders and switches are the “more binary” devices in the group; other items are “more analog”

Prerequisites

No prerequisites beyond the basic Breadboard Arduino class. These programs cover new material for this class and do not build on previous material.

Method

Cover analog versus digital input. Reiterate voltage capacities of the Arduino (0-5 volts). More information is available through the serial output than with LEDs in this segment.

Notes

There are multiple circuits on this board. Neither takes up much breadboard space or pins on the Arduino. If the infrared rangefinder is the Sharp brand, then a connector will most likely need to be built. In this case, a three pin, 0.10 inch pitch header pin was soldered to the end of the special pigtail for the sensing unit. After soldering, insulation and stability were needed, so a blob of hot-melt glue was added to the header pin.

The Parallax PIR unit, without a pigtail will only fit on the corner of the board due to I/O pin placement and jumper pin placement. A couple of ling wires are needed to connect to the Arduino. Other components are fairly straightforward.

The programs have some serial output to be displayed on the computer monitor. Power indicators may be left off.

The Class

Optical sensors are sensitive to light. Infrared (IR) has been grouped into this segment as it is looked at as both heat and light. It is light that cannot be seen with the naked eye, but certain electronic devices are sensitive to it. The remote control for your television is an IR device. For some reason, cameras on cell phones are sensitive to IR light. If you aim your TV remote at your cell phone camera, you will be able to see the light produced by the remote. There is more going on than just an IR flashlight, but at least you can verify that the batteries are not dead.

In this class, there are three devices- a simple photo resistor that passes power as a function of the amount of light striking it. This particular device is translucent and as such, is also sensitive to some of the light striking the back of the device. As more light strikes the surface, the resistance lowers. When the resistance lowers, more voltage appears on the Arduino analog pin and the Arduino returns a higher numerical value.

The infrared rangefinder uses reflected infrared light to determine range up to about 50 inches. Since it is using light, it is also susceptible to interference- things that would also get in the way of visible light. It is also sensitive to the color of the reflective surface. If sensing people, different colored clothing will yield different responses. It is not an exact science.

The Passive Infrared (PIR) device works the same way as the motion detector lights that light your driveway when someone walks by. It has a series of Fresnel lenses over an IR-sensitive device. When the device senses IR moving from one lens to another, a signal is produced. This device is also sensitive to distance. This particular PIR is a Parallax device designed for hobbyists.


Monday, May 10, 2010

Package from Sparkfun redux

It came- hooray for Sparkfun! Well, it probably came on Friday, but I wasn't there to receive it. I had it shipped to work thinking for some reason that it would get int my hands faster. In reality, the opposite was true. I received five twenty-eight pin chips with the little red dot. Now, I have to find out how to return the non-arduino chips. I'm pretty sure they have a procedure for that.

So, the big lesson here is that Sparfun made a boo-boo. Hey- it happens. The important thing is that they corrected the situation in a timely manner. When you next need electronic components- how about checking http://www.sparkfun.com/ first?

I should get back to work.

Monday, May 3, 2010

Arduino Light Dependent Resistor

Well, tonight, the board has a light dependent resistor (LDR). Only two of the three leads are used, so it's a little tacky, but this is, after all, prototyping. It will be cleaned up later- functionality is the name of the game right now. The analog value returned from the LDR drops with the light level. Using this value will enable the implementation of a small night-light circuit rather easily.

The easiest approach is to take the value returned from the LDR and feed it into an analogWrite command and use PWM to alter the brightness of the LED. Doing this directly would normally dim the LED as the light was dimmed. The LED was reversed and now operates as the inverse of the value read from the LDR. That is, as the light dims, the LDR returns a lower value, that value is fed into the analogWrite command and as the value drops, the LED gets brighter. Quick, easy, effective.

Here is the code in action:



Here is the board in action:


Happy breadboarding!

Sunday, May 2, 2010

Arduino Infrared

OK-
Nothing from Sparkfun yet, but weekend delivery was not expected- They need time to respond. So the next best thing was to borrow an Arduino off another board and get moving again.

The current project is an optical board with Arduino. Starting with infrared which may not actually be classified as optical, but it will be for this board. Passive Infrared (PIR) coupled with an infrared rangefinder makes sort of a neat human detector (or dog, cat, rats, what-have-you). Currently, the two items operate independently, but the code will be changed to let the PIR drive. If a heat source is sensed, then the rangefinder will be engaged. Perhaps. There are other approaches.

For your viewing pleasure, here is a picture of the board so far. It's a little blurry, but you should be able to get the point.


The PIR is at the bottom right, the IR rangefinder is at the upper right with the cable pinned under the breadboard. The LEDs indicate the power is on for the PIR and it has sensed motion, and power is on for the IR rangefinder and it has not yet been engaged.

More news as it happens.

Friday, April 30, 2010

Another Sparkfun Response

OK- from the previous post, it would seem that Sparkfun made a boo-boo and is doing the right thing to fix it. Hurray for Sparkfun!

While I am composing the last post, this email comes in (I left off the email headerinformation because it was a pain to post as it kept gagging the HTML):

Hello Bruce,

Our returns department finished testing the ATmega328s you returned to us, and found that they had somehow made it out without the Arduino Bootloader having been loaded. I have placed a new order, # 21xxxx, which contains five ATmega328, DEV-09217.

Please let me know if I can help with anything else, and have a great day!

Best,

L (Sparkfun rep name)
Customer Service
SparkFun Electronics

Now- I have not yet returned anything, but they have tested them.  I think I will wait and see what comes in the mail. Sparkfun may be experiencing growing pains- that's OK; it happens. Let's see how they handle it. I believe they will make everything right, it just may take another pass at the problem to get there.

Sparkfun Response

Received from Sparkfun:

Subject: Re: [FWD: SparkFun Order 21xxxx]
From: Tech Support
Date: Fri, April 30, 2010 10:16 am
To: "Your Host"


Hi Bruce,


I talked to customer service, they should be sending you out 5 replacement ATMega328s with the bootloader and a return label for the 5 unprogrammed ones. Sorry for the inconvenience this has caused.


Thanks,


P (Sparkfun rep name)

Monday, April 26, 2010

Sent to Sparkfun

Subject: [FWD: SparkFun Order 2xxxxx]
Date: Mon, April 26, 2010 11:39 pm
To: customerservice@sparkfun.com

Good day.

I received my latest order from Sparkfun. I had some spark, but unfortunately, no fun.

On my previous order, I received Arduino 328 chips. All were marked with a red dot but one. I had my doubts, so I reserved it. When attempting a project with the unmarked chip, it would not load. OK, I still needed some more Arduino chips, so I ordered four more- Order 2xxxxx. I received the four chips I ordered, but none were marked. I removed one from the package and tested it- it would not load.

Here is what I did to test:

1) Took a known good circuit and removed the Arduino
2) Installed the unmarked Arduino
3) Recompiled the code
4) Attempted to download
5) Received the following error:
avrdude: stk500_getsync(): not in sync: resp=0x00
avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x51
6) Powered down
7) reinstalled the known good chip
8) Powered up, recompiled code
9) Downloaded code
10) Code executed as expected

I think none of these chips has the Arduino bootloader loaded on, even though my packing list has a certification of compliance signed by the Customer Service Manager. What do you think?

I am attempting to write a class using Arduino chips, but that is rather difficult when they are not the correctly configured chip and my deadlines are slipping. I now have 5 chips that are not what I purchased. What can you do to rectify this situation?

Sincerely,

Testing the Unknown

Not what I wanted to see:

avrdude: stk500_getsync(): not in sync: resp=0x00
avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x51
 
Looks like my backup chip really is not an Arduino.
Neither are the chips in the new order.
 
I took a known good circuit with a known good Arduino in it, removed the Arduino and replaced it with an unmarked chip. I recompiled the code and tried to download it. I received the error above. I powered down, swapped the known good chip back in, powered up, recompiled, loaded to the chip and the program ran as expected.
 
Time to contact Sparkfun.

Package from Sparkfun

The package from Sparkfun arrived today. I need to do some testing. On the last order, all the chips were marked with a red dot, except one. The unmarked chip does not appear to have the Arduino bootloader on it. I will run one more test on it. None of the chips that arrived today were marked. I hope they just forgot to mark them.

I am hopeful that I can start on the Arduino project again- I have ideas and need to implement them!

Slightly out-of-focus pictures below tell the story better.

Marked Arduino on left, Unmarked, probably not Arduino on right.

Unmarked chips. Hoping for bootloaders.

Since we are on the topic, it has been bbrought to my attention that one may construct an Arduino bootloader burner rather easily. This may be something to add to the end of the class. If I have an order of plain AtmelATMega 328 chips, then I may have to do this. Not without a call to Sparkfun first.


Saturday, April 24, 2010

Anticipation

Not much going on right now. Awaiting the delivery of new Arduinos from Sparkfun. My last adventure cost me an Arduino, if you remember. I will have A new Arduino as well as a few spares now. More posts as things move forward.

Saturday, April 17, 2010

Good day at The Generator

Today is the last Saturday of National Robotics Week. DPRG marked that date with an event at The Generator, a coffee shop in downtown Garland. the Arduino project made an appearance as well. There would have been one more Arduinp project board, but trying to get the board running at 6:30 this morning, a careless application of 12 volts was made, and that particular Arduino chip is no more. My backup chip, it turns out, may be a wonderful ATMega 328, but it is no Arduino. Maybe at one point, I will learn how to put the bootloader on the ATMega, but not today. Time for another order from Sparkfun.

The Arduino appeared in a rare, shared-power configuration. The Cylon board already had a voltage regulator on it, the Ping did not. These particular boards will snap together, so they were shapped and a jumper was run between the positive and negative 5-volt buses on each board. It would have looked great with the switching board in the middle, but that was not to be today.

Friday, April 9, 2010

RBNO

It's been a busy week.

Tuesday night was a productive night at Robot Builders Night Out (RBNO), a weekly gathering of DPRG (Dallas Personal Robotics Group http://www.dprg.org/ ) members. I finished a basic Arduino breadboard for the next class session. The next task is to see how much junk I can cram onto this board. It is sitting in front of me and the only additions are the USB to TTL converter and a phototransistor.

There have only been minimal changes made to the class, so there isn't much to report there.

Hopefully, I can make some progress this weekend and have more to report to you.

Monday, April 5, 2010

Arduino Project Checkpoint

Well, maybe I haven't been quite fair with you. Much of the work of the Arduino Project has been completed; at least as a draft. You have gotten to see snippets of the document without getting anything complete. I won't apologize for that as it is still a working document. I can't share the document at this point as I am working with someone else on this and have not discussed the topic with him.

What I will do is share the table of contents with you. I know, it isn't much, but you can get a feel for how things are progressing. The section on reading input has not been started yet. I need to build the board, write the class and the programs. 

If you happen to be within the reach of the Dallas Personal Robotics Group (http://www.dprg.org/), then please consider taking the introductory class and getting that under your belt. If you happen to BE a DPRG member, so much the better. If you are NOT YET a member of DPRG, visit the website and sign up! We do a lot of interesting things and have a lot of fun.

There are still a lot of detail items to complete before this class can be offered, but forward motion is being made; please have patience and the class should be available soon!

Remember- this is a DRAFT!

The Table of Contents is really tiny as that is the size I had to select to get the TOC to fit on the page. Go get your reading glasses and check it out.


Here is the Table of Contents:



Arduino Motor Control Breadboarding

OK- assuming you have already built your breadboard Arduino in the introductory class, here is where everything goes for the motor control session. Just plug and play. At this point you will still need motors, external power, and programming. 

You are playing along at home, aren't you?

Sunday, April 4, 2010

Arduino Using Ping ))) (tm)

Here is your latest snippet.

The Class


Ping)))™

What is Ping? “Ping” is a networking term used to troubleshoot network issues. It sends out a request and times how long before the response. It is analogous to a sonar ping used in submarines where a sound (audible or inaudible) is sent out and the response is timed to determine the distance of objects in water.

This demonstration uses a product from Parallax.com that is also called “ping”. Ping ))) ™ to be exact.

From the Parallax website: The Ping sensor measures distance using sonar; an ultrasonic (well above human hearing) pulse is transmitted from the unit and distance-to-target is determined by measuring the time required for the echo return. Output from the PING))) sensor is a variable-width pulse that corresponds to the distance to the target.

Read the Wikipedia entry: http://en.wikipedia.org/wiki/Sonar

Using Sonar

The Arduino chip is used to measure the distance as sound travels at a generally predictable rate through air at given densities (generally associated with altitude). The variances aren’t beyond usable in hobby robots.

Arduino supplies some code with the development platform code that handles the Ping )))™ (heretofore called just “Ping”) does return distance based on time of signal return. For this demonstration, functionality was added:

a) Delta distance

b) Indicating delta distance

c) Indicating direction

Sonar may be made more useful if other data points are included. Because the distance is measured with sound, it is not precise. The more measurements that are taken, then generally, the better the data on distance. However, there has to be a stopping point somewhere. This demonstration code takes the average (mean) of 4 distance samples. A better determination might be made taking the modal values and discarding the rest. This will be left as an exercise.

Once an acceptable distance is measured, the value is kept until the next measurement is averaged. The two distances are compared and the Delta (finite forward difference) of the distance is taken. From the Delta, direction may be determined- if the distance is smaller, then the gap between Ping and the sensed object is closing. If the distance is greater, then the gap is increasing.

Since the time between samples is known, then the rate of Delta may also be determined. At this point the following items are known:

Two distances

The Delta of those two distances

The rate of Delta for those two distances

Once the above information is in-hand...

==============

I know, this is such a tease- remember that the document is still in draft status right now.
Enjoy!

Saturday, April 3, 2010

Arduio Motor Control CLASS

I have, for the most part, finished the write-up for the motor control portion of the Arduino Project. The code works, the breadboarding is complete and the class is written. It's about time to move on to sensing input with the Arduino. However, for your enjoment, I have included a snippet from the class:

The Class

What is an H-bridge?

That’s a really good question. It is a device that allows voltage to be applied in either direction. The “H” is due to the graphical representation of the circuit used to control DC motor direction.

When controlling motors, especially drive motors, it is usually desirable to be able to not only control the motor speed with PWM, but to control the motor direction as well. To do that with a DC motor (the component used for this demonstration), one must reverse the polarity of the motor connections. Of course, this may be done with a relay, but a relay is not particularly advantageous for robotic control. One would like to be able to switch the motor direction at transistor speeds. It is possible to build a H-bridge with discreet components, but a low-cost H-bridges are available in DIP packages in such quantity that is makes more sense to try to find one of those to fit the project instead of “rolling your own”.

More information may be found on Wikipedia: http://en.wikipedia.org/wiki/H-bridge

This project uses the SN754410 Quadruple Half H-Driver. This particular unit was purchased from Sparkfun. It is a 16-pin DIP and will control two motors; 4.5 – 36 volts, one amp continuous rating. At this writing, Sparkfun offers the chip for $2.35.

The H-bridge has three distinct features that are interesting for this demonstration:

1) It can control two motors at significantly more power drain than the Arduino can

2) It is switchable at transistor speeds, direction AND speed; it supports PWM

3) It’s cheap

It also breadboards easily.

The way the H-bridge is controlled in this demonstration ...
 
And that is your tittilating tidbit for today. Enjoy!

Thursday, April 1, 2010

Nuts & Volts

This month's Nuts & Volts magazine (http://www.nutsvolts.com/) has an interesting article on breadboarding with the Arduino. Smiley builds a pretty breadboard. The breadboards in the advanced class will not be that neat. As there will be several projects during the course, the boards will be assembled and disassembled several times; there will not be time for nicely fitted connections.

Smiley also writes about Arduino novices and more experienced types. That is an important point to cover. The advanced Arduino course here is for the novice. Having fun is a big part of the course. Delving into the inner workings of the Arduino may indeed be fun for some, it is not typically an exercise for the novice.

In addition, Mr. Pardue is using a different development environment than this class will be using. Here is the environment for this Arduino class:


Obviously, there are many other development environments available, and each student is encouraged after the class to explore other options aviailable. This class is focused on learning and having fun. Students can take many paths in exploring the Arduino. This is your snippet for this evening.

National Robotics Week Arpil 10-18, 2010!

Monday, March 29, 2010

Arduino Project Mission, Goal and Scope

Today's snippet on the Arduino Project

Advanced Arduino


Mission Statement

The mission of the Breadboard Arduino Project is to provide hands-on training with the Arduino micro controller with widely available and generally affordable components in a breadboard prototyping environment. In other words, Learn Arduino, Have Fun, On the Cheap.

Course Goal

The goal of this course is to provide the student with a working knowledge of Arduino features that are beyond the introductory course. It is intended to be a stepping stone on the student’s path to Arduino enlightenment.

Course Intent

The intent of this class is to provide the student with a handful of tools that should be helpful in developing robotic platforms using the Arduino platform. It is not intended to be the definitive course on use of the Arduino and does not delve into the architecture of the chip. Indeed, this class does not really exploit any particular feature of the Arduino, but will leave the student with the knowledge of how to interface the Arduino with other components and assemblies.

In addition, the intent of this class is to let the student experience working with the Arduino at minimal cost. Students are encouraged to shop for lowest prices on components and buy in bulk when it makes sense. This course is specifically intended to keep costs as low as possible. Arduino has a development platform called the Duemilanove (extra credit for pronouncing it correctly). It’s a dandy platform, but at this writing, Sparkfun carries it for $29.95 + S&H. For our purposes, it doesn’t do anything better than what the student built in the introduction to Arduino class. In addition, for the exercises, one would still need a breadboard and all the additional components. Also, with the breadboard class, prototyping another chip means swapping out the Arduino with another chip and rewiring components. That activity may be performed for the cost of the new chip.

Overall, this class provides hands-on education at a low cost with a development platform and components that are reusable with other micro controllers. And it’s fun!

Course Scope

The scope of this class is limited to breadboard prototyping of different robotic functions including

• Indicator lights

• Switching

• Motor control

• Sensor input

• Position

• Motion

In addition, the coding is limited to the Arduino development platform and the Arduino interpretation of the “C” programming language. Even though the Arduino is an Atmel ATMega 328 chip, the specific Atmel and AVR functionality will not be specifically covered. Coding at the assembler level will not be covered. Should you wish to teach those classes, your involvement will be heartily welcomed.

The particular Arduino used in the Breadboard Arduino series is the Atmel ATMega 328 chip in the 28P3 28 pin PDIP (Plastic Dual Inline Pin) package. This is generally affordable, readily available, easily handled by hobbyists and lends itself well to breadboard prototyping. Outside of this class, you are welcome and encouraged to explore other chips and packages.

Intended Audience

The intended audience for this class is students that have participated in the Introduction to Breadboarding Arduino class as delivered by Dale Wheat. This prerequisite class defines the foundation for this class, familiarizes the student with the Arduino chip and the student will have already built the breadboarded Arduino that is used as the base for each of the sessions in this class.

Saturday, March 27, 2010

More Arduino Motor Control Powered Up

Well, no picture this time. Photographically, there is no change. There are changes in the program. I have added a smooth start section to the program that will start the machine smoothly and tap the brakes at the end of the cycle. I have also added a sweeping turn functionality.

The down side to all this is that I am running the chassis on the bench. I need to solve several mobility issues. The breadboard is a collection of wires that will not tolerate a crash. The battery is too big for the chassis. It does make a good demonstration nonetheless.

I think that is enough fun for one day. Church in the morning.