Slideshare.net (beta)

 
Post: 
Myspace Hi5 Friendster Xanga LiveJournal Facebook Blogger Tagged Typepad Freewebs BlackPlanet gigya icons



All comments

Add a comment on Slide 1

If you have a SlideShare account, login to comment; else you can comment as a guest


Showing 1-50 of 0 (more)

Arduino Lecture 3 - Making Things Move and AVR programming

From eoinbrazil, 3 months ago

Further following up the Arduino set of lectures with topics on Mo more

792 views  |  1 comment  |  0 favorites  |  8 downloads  |  1 embed (Stats)
 

Groups/Events

Not added to any group/event

 
 

Privacy InfoNew!

This slideshow is Public

 
CC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike License
Embed in your blog
Embed (wordpress.com)
custom

Slideshow Statistics
Total Views: 792
on Slideshare: 765
from embeds: 27* * Views from embeds since 21 Aug, 07

Slideshow transcript

Slide 1: Making Things Move and AVR Programming CS4062 - Eoin Brazil - Semester 2 - 2008

Slide 2: Servos and Motors Motion linear or rotary Stepper Servo conversion issues Types DC Servo Gearhead DC Motor Stepper Gearhead

Slide 3: DC Motor 2 Connections Continual spin, given current & voltage Reversing current, reverses the direction Increasing the voltage, spins faster, decreasing the voltage, slows the spin High speed but low torque Gearbox can add torque but at the expense of speed

Slide 4: DC Motor Example

Slide 5: DC Motor Example

Slide 6: DC Motor Example

Slide 7: Gearhead Motor DC Motor with gearbox Not fast but provide more torque Servo Motor Gearhead Gearhead motor with position feedback Feedback is often from potentiometer Pulsing the motor moves it to particular position within 180 degree range Can’t move 360 degrees but can be Servo positioned precisely within the 180 degree range

Slide 8: Stepper Motor Precise positioning & 360 degrees range Move in discrete steps around a circle A 200 step motor would move 1.8 degrees per step around the full 360 degrees Continuous rotation in either direction Good torque Complex to connect

Slide 9: Solenoids and Actuators Microactuators Linear Motion Actuator Pull or Push Types Solenoid Solenoid Actuator Microactuator

Slide 10: Motor Characteristics gears or direct rated voltage current (efficiency) - stall / running speed - spin / rpm, rps, Hz torque size, shaft diameter, shaft length position resolution (Servos & Steppers)

Slide 11: Advanced Mediation Lisa McElligott, 2000 interactive confessional box used real confessional box confessor was computer program interacted using a voice interface. scripted interactions with random noises to add to immersion suspension of disbelief realism

Slide 12: Weave Mirror Daniel Rozin, Weave Mirror, 2007 Mechanical mirror Any person standing in front of one of these pieces is instantly reflected on its surface. Side and back Uses video cameras, motors and views computers to achieve mirroring Sound aspect - soothing sound

Slide 13: Weave Mirror Daniel Rozin, Weave Mirror, 2007

Slide 14: PWM Analog input / output Duration of the digital pulse of voltage Microcontroller - HIGH 5V or LOW 0V ``Fake’’ it using PWM Duty cycle, ratio from low to high to low cycle LED dimming, DC Motor speed control, Piezo speakers, RC Servo positioning

Slide 15: Pulse Width Modulation

Slide 16: Wiring Diagram Schematic Diagram

Slide 17: RC Servo Motor Servo Motor Connections on Arduino Black wire would go to Grd pin Red wire would go to 5V power pin White wire would go to one of the digital pins on the board Colours can vary, Ground (black or brown), Power (red), Control (orange, yellow or white)

Slide 18: /* * NewSerialServo * -------------- * Servo control from the Serial port * * Alteration of the control interface to use < and > keys * to slew the servo horn left and right. Works best with * the Linux/Mac terminal "screen" program. * * Created 10 December 2007 * copyleft 2007 Brian D. Wendt * http://principialabs.com/ * * Adapted from code by Tom Igoe, http://itp.nyu.edu/physcomp/Labs/Servo */ /** Adjust these values for your servo and setup, if necessary **/ int servoPin = 2; // control pin for servo motor int minPulse = 600; // minimum servo position int maxPulse = 2400; // maximum servo position int turnRate = 100; // servo turn rate increment (larger value, faster rate) int refreshTime = 20; // time (ms) between pulses (50Hz) /** The Arduino will calculate these values for you **/ int centerServo; int pulseWidth; // center servo position // servo pulse width continued int moveServo; // raw user input long lastPulse = 0; // recorded time (ms) of the last pulse on next slide

Slide 19: /* * NewSerialServo * -------------- * Servo control from the Serial port Setup the necessary * * Alteration of the control interface to use < and > keys * to slew the servo horn left and right. Works best with control values and variables to store * the Linux/Mac terminal "screen" program. * * Created 10 December 2007 information * copyleft 2007 Brian D. Wendt * http://principialabs.com/ * * Adapted from code by Tom Igoe, http://itp.nyu.edu/physcomp/Labs/Servo */ /** Adjust these values for your servo and setup, if necessary **/ int servoPin = 2; // control pin for servo motor int minPulse = 600; // minimum servo position int maxPulse = 2400; // maximum servo position int turnRate = 100; // servo turn rate increment (larger value, faster rate) int refreshTime = 20; // time (ms) between pulses (50Hz) /** The Arduino will calculate these values for you **/ int centerServo; int pulseWidth; // center servo position // servo pulse width continued int moveServo; // raw user input long lastPulse = 0; // recorded time (ms) of the last pulse on next slide

Slide 20: // Main program setup void setup() { pinMode(servoPin, OUTPUT); // Set servo pin as an output pin centerServo = maxPulse - ((maxPulse - minPulse)/2); pulseWidth = centerServo; // Give the servo a starting point (or it floats) Serial.begin(9600); Serial.println(" Arduino Serial Servo Control"); Serial.println("Press < or > to move, spacebar to center"); Serial.println(); } void loop() { // wait for serial input if (Serial.available() > 0) { // read the incoming byte: moveServo = Serial.read(); // ASCII '<' is 44, ASCII '>' is 46 (comma and period, really) if (moveServo == 44) { pulseWidth = pulseWidth - turnRate; } if (moveServo == 46) { pulseWidth = pulseWidth + turnRate; } if (moveServo == 32) { pulseWidth = centerServo; } // stop servo pulse at min and max continued if (pulseWidth > maxPulse) { pulseWidth = maxPulse; } if (pulseWidth < minPulse) { pulseWidth = minPulse; } on next } slide

Slide 21: // Main program setup void setup() { pinMode(servoPin, OUTPUT); // Set servo pin as an output pin centerServo = maxPulse - ((maxPulse - minPulse)/2); pulseWidth = centerServo; // Give the servo a starting point (or it floats) Serial.begin(9600); Serial.println(" Arduino Serial Servo Control"); Serial.println("Press < or > to move, spacebar to center"); Setup servo its } Serial.println(); pin, its pulse, and void loop() { // wait for serial input its position. Setup if (Serial.available() > 0) { // read the incoming byte: serial connection moveServo = Serial.read(); // ASCII '<' is 44, ASCII '>' is 46 (comma and period, really) for control if (moveServo == 44) { pulseWidth = pulseWidth - turnRate; } if (moveServo == 46) { pulseWidth = pulseWidth + turnRate; } if (moveServo == 32) { pulseWidth = centerServo; } // stop servo pulse at min and max continued if (pulseWidth > maxPulse) { pulseWidth = maxPulse; } if (pulseWidth < minPulse) { pulseWidth = minPulse; } on next } slide

Slide 22: // Main program setup void setup() { pinMode(servoPin, OUTPUT); // Set servo pin as an output pin centerServo = maxPulse - ((maxPulse - minPulse)/2); pulseWidth = centerServo; // Give the servo a starting point (or it floats) Serial.begin(9600); Serial.println(" Arduino Serial Servo Control"); Serial.println("Press < or > to move, spacebar to center"); Serial.println(); } The serial input controls the void loop() { // wait for serial input servo by the ‘<‘ or ‘>’ and keep if (Serial.available() > 0) { // read the incoming byte: moveServo = Serial.read(); its speed within the safe range // ASCII '<' is 44, ASCII '>' is 46 (comma and period, really) if (moveServo == 44) { pulseWidth = pulseWidth - turnRate; } if (moveServo == 46) { pulseWidth = pulseWidth + turnRate; } if (moveServo == 32) { pulseWidth = centerServo; } // stop servo pulse at min and max continued if (pulseWidth > maxPulse) { pulseWidth = maxPulse; } if (pulseWidth < minPulse) { pulseWidth = minPulse; } on next } slide

Slide 23: // pulse the servo every 20 ms (refreshTime) with current pulseWidth // this will hold the servo's position if unchanged, or move it if changed if (millis() - lastPulse >= refreshTime) { digitalWrite(servoPin, HIGH); // start the pulse delayMicroseconds(pulseWidth); // pulse width digitalWrite(servoPin, LOW); // stop the pulse lastPulse = millis(); // save the time of the last pulse } } // END of Main program

Slide 24: Pulse the servo every 20ms, this is where the desired change actually happens and its based on the previous serial input // pulse the servo every 20 ms (refreshTime) with current pulseWidth // this will hold the servo's position if unchanged, or move it if changed if (millis() - lastPulse >= refreshTime) { digitalWrite(servoPin, HIGH); // start the pulse delayMicroseconds(pulseWidth); // pulse width digitalWrite(servoPin, LOW); // stop the pulse lastPulse = millis(); // save the time of the last pulse } } // END of Main program

Slide 25: Sketching your work Bill Verplank Interaction Design Sketchbook Bill Buxton

Slide 26: Embodiment using Animatronics Stefan Marti 2005, Autonomous Interactive Intermediaries 2005, Physical Embodiments for Mobile Communication Agents

Slide 27: Kinematics Gears and mechanical models Geometry of pure motion without reference to force or mass Cornell University Library, Kinematic Models for Design Digital Library Examples from (KMODDL) www.flying-pig.co.uk Tutorials, models, e-books, e.g. Linkages Chapter 3 in Building Robot Drive Trains

Slide 28: PWM Tutorials ITP Servo tutorial Principial Labs Arduino Servo Driving a Unipolar Stepper Motor Driving a Bipolar Stepper Motor ITP Servo lab, uses a potentiometer to Making an RC Servo wall following car control the servo.

Slide 29: Arduino Library Software Servo Library attach(int) Turn a pin into a servo driver. detach() Release a pin from servo driving. write(int) Set the angle of the servo in degrees, 0 to 180. read() return that value set with the last write(). attached() return 1 if the servo is currently attached. refresh() must call once every 50ms to keep servos updated, won't call more than every 20ms setMinimumPulse(uint16_t) set the duration of the 0 degree pulse in microseconds. (default minimum value is 544 microseconds) setMaximumPulse(uint16_t) set the duration of the 180 degree pulse in microseconds. (default maximum pluse value is 2400 microsconds) Need to first send position with write() before you can receive any control signals

Slide 30: Projects and Prototyping Trade-offs

Slide 31: Projects and Prototyping Trade-offs Re-programmable

Slide 32: Projects and Prototyping Trade-offs Size matters

Slide 33: Existing Toolkits

Slide 34: Existing Toolkits Sufficient for almost all needs

Slide 35: Existing Toolkits Chips and Sufficient for PCBs almost all needs

Slide 36: Arduino Advanced Arduino ATMega168 ATTiny13

Slide 37: Arduino Advanced Arduino ATMega168 ATTiny13 Approx. ~$35

Slide 38: Arduino Advanced Arduino ATMega168 Approx. ~$4 ATTiny13 Approx. ~$35

Slide 39: Arduino Advanced Arduino ATMega168 Approx. ~$4 ATTiny13 Approx. Approx. ~$35 ~$1

Slide 40: AVR Programmer

Slide 41: AVR ATTiny13 Blinky

Slide 42: AVR ATTiny13 Blinky

Slide 43: /* Two LEDs, tied to pin b0 and to b1 which correspond to physical pins 5 and 6 on ATTINY13 are turned on for 100ms and then off for 200ms */ #include <avr/io.h> #define F_CPU 1000000 // set to 1 MHz as delay.h needs F_CPU #include <util/delay.h> #include "pin_macros.h" // Leah Buechley's pin macros for AVRs - very useful int main(void) { // Set Port B pins for 3 and 4 as outputs b0_output; //initialize LED pin b1_output; //initialize LED pin b0_high; //LED is off b1_high; //LED is off DDRB = 0x18; // In binary this is 0001 1000 (note that is bit 3 and 4) for ( ; 1==1 ; ) // loop while 1 equals 1 - forever - C style loop { // Set Port B pins for 3 and 4 as HIGH (i.e. turn the LEDs on) b0_low; //LED is on b1_low; //LED is on _delay_loop_2(65535); b0_high; //LED is off b1_high; //LED is off _delay_loop_2(65535); } return 1; }

Slide 44: /* Two LEDs, tied to pin b0 and to b1 which correspond to physical pins 5 and 6 on ATTINY13 are turned on for 100ms and then off for 200ms */ #include <avr/io.h> #define F_CPU 1000000 // set to 1 MHz as delay.h needs F_CPU #include <util/delay.h> Include the #include "pin_macros.h" // Leah Buechley's pin macros for AVRs - very useful int main(void) libraries and set { // Set Port B pins for 3 and 4 as outputs b0_output; //initialize LED pin the speed of chip b1_output; //initialize LED pin b0_high; //LED is off b1_high; //LED is off DDRB = 0x18; // In binary this is 0001 1000 (note that is bit 3 and 4) for ( ; 1==1 ; ) // loop while 1 equals 1 - forever - C style loop { // Set Port B pins for 3 and 4 as HIGH (i.e. turn the LEDs on) b0_low; //LED is on b1_low; //LED is on _delay_loop_2(65535); b0_high; //LED is off b1_high; //LED is off _delay_loop_2(65535); } return 1; }

Slide 45: /* Two LEDs, tied to pin b0 and to b1 which correspond to physical pins 5 and 6 on ATTINY13 are turned on for 100ms and then off for 200ms */ #include <avr/io.h> #define F_CPU 1000000 // set to 1 MHz as delay.h needs F_CPU #include <util/delay.h> #include "pin_macros.h" // Leah Buechley's pin macros for AVRs - very useful int main(void) Setup LED pins, Data { // Set Port B pins for 3 and 4 as outputs b0_output; //initialize LED pin b1_output; //initialize LED pin Direction Register and b0_high; b1_high; //LED is off //LED is off turn LEDS off. DDRB = 0x18; // In binary this is 0001 1000 (note that is bit 3 and 4) for ( ; 1==1 ; ) // loop while 1 equals 1 - forever - C style loop { // Set Port B pins for 3 and 4 as HIGH (i.e. turn the LEDs on) b0_low; //LED is on b1_low; //LED is on _delay_loop_2(65535); b0_high; //LED is off b1_high; //LED is off _delay_loop_2(65535); } return 1; }

Slide 46: /* Two LEDs, tied to pin b0 and to b1 which correspond to physical pins 5 and 6 on ATTINY13 are turned on for 100ms and then off for 200ms */ #include <avr/io.h> #define F_CPU 1000000 // set to 1 MHz as delay.h needs F_CPU #include <util/delay.h> #include "pin_macros.h" // Leah Buechley's pin macros for AVRs - very useful int main(void) { // Set Port B pins for 3 and 4 as outputs Loop - Turn the pins b0_output; //initialize LED pin b1_output; //initialize LED pin on, wait for 262ms, and b0_high; b1_high; //LED is off //LED is off turn off. Repeat. DDRB = 0x18; // In binary this is 0001 1000 (note that is bit 3 and 4) for ( ; 1==1 ; ) // loop while 1 equals 1 - forever - C style loop { // Set Port B pins for 3 and 4 as HIGH (i.e. turn the LEDs on) b0_low; //LED is on b1_low; //LED is on _delay_loop_2(65535); b0_high; //LED is off b1_high; //LED is off _delay_loop_2(65535); } return 1; }

Slide 47: # Makefile for sample_led_program for ATtiny13 chip # Note: to use makefile with a different chip change all # mmcu statements (-mmcu=attiny13) to reflect new chip # also change the part option (-p t13) for the avrdude install command # default target when "make" is run w/o arguments all: sample_led_program.rom # compile sample_led_program.c into sample_led_program.o sample_led_program.o: sample_led_program.c avr-gcc -c -g -O0 -Wall -mmcu=attiny13 sample_led_program.c -o sample_led_program.o # link up sample_led_program.o into sample_led_program.elf sample_led_program.elf: sample_led_program.o avr-gcc sample_led_program.o -Wall,-nm,-Map=sample_led_program.map,--cref - mmcu=attiny13 -o sample_led_program.elf # copy ROM (FLASH) object out of sample_led_program.elf into sample_led_program.rom sample_led_program.rom: sample_led_program.elf avr-objcopy -O ihex sample_led_program.elf sample_led_program.rom # command to program chip (invoked by running "make install") install: avrdude -c usbtiny -p t13 -e -U flash:w:sample_led_program.rom # command to clean up junk (no source files) (invoked by "make clean") clean: rm -f *.o *.rom *.elf *.map *~

Slide 48: # Makefile for sample_led_program for ATtiny13 chip # Note: to use makefile with a different chip change all # mmcu statements (-mmcu=attiny13) to reflect new chip # also change the part option (-p t13) for the avrdude install command # default target when "make" is run w/o arguments all: sample_led_program.rom When Make is run, # compile sample_led_program.c into sample_led_program.o needs a target sample_led_program.o: sample_led_program.c avr-gcc -c -g -O0 -Wall -mmcu=attiny13 sample_led_program.c -o sample_led_program.o # link up sample_led_program.o into sample_led_program.elf sample_led_program.elf: sample_led_program.o avr-gcc sample_led_program.o -Wall,-nm,-Map=sample_led_program.map,--cref - mmcu=attiny13 -o sample_led_program.elf # copy ROM (FLASH) object out of sample_led_program.elf into sample_led_program.rom sample_led_program.rom: sample_led_program.elf avr-objcopy -O ihex sample_led_program.elf sample_led_program.rom # command to program chip (invoked by running "make install") install: avrdude -c usbtiny -p t13 -e -U flash:w:sample_led_program.rom # command to clean up junk (no source files) (invoked by "make clean") clean: rm -f *.o *.rom *.elf *.map *~

Slide 49: # Makefile for sample_led_program for ATtiny13 chip # Note: to use makefile with a different chip change all # mmcu statements (-mmcu=attiny13) to reflect new chip # also change the part option (-p t13) for the avrdude install command # default target when "make" is run w/o arguments Use avr-gcc to compile all: sample_led_program.rom ‘c’ program # compile sample_led_program.c into sample_led_program.o sample_led_program.o: sample_led_program.c avr-gcc -c -g -O0 -Wall -mmcu=attiny13 sample_led_program.c -o sample_led_program.o # link up sample_led_program.o into sample_led_program.elf sample_led_program.elf: sample_led_program.o avr-gcc sample_led_program.o -Wall,-nm,-Map=sample_led_program.map,--cref - mmcu=attiny13 -o sample_led_program.elf # copy ROM (FLASH) object out of sample_led_program.elf into sample_led_program.rom sample_led_program.rom: sample_led_program.elf avr-objcopy -O ihex sample_led_program.elf sample_led_program.rom # command to program chip (invoked by running "make install") install: avrdude -c usbtiny -p t13 -e -U flash:w:sample_led_program.rom # command to clean up junk (no source files) (invoked by "make clean") clean: rm -f *.o *.rom *.elf *.map *~

Slide 50: # Makefile for sample_led_program for ATtiny13 chip # Note: to use makefile with a different chip change all # mmcu statements (-mmcu=attiny13) to reflect new chip # also change the part option (-p t13) for the avrdude install command # default target when "make" is run w/o arguments Use avr-gcc on `o’ obj all: sample_led_program.rom file to create `elf’ file # compile sample_led_program.c into sample_led_program.o sample_led_program.o: sample_led_program.c avr-gcc -c -g -O0 -Wall -mmcu=attiny13 sample_led_program.c -o sample_led_program.o # link up sample_led_program.o into sample_led_program.elf sample_led_program.elf: sample_led_program.o avr-gcc sample_led_program.o -Wall,-nm,-Map=sample_led_program.map,--cref - mmcu=attiny13 -o sample_led_program.elf # copy ROM (FLASH) object out of sample_led_program.elf into sample_led_program.rom sample_led_program.rom: sample_led_program.elf avr-objcopy -O ihex sample_led_program.elf sample_led_program.rom # command to program chip (invoked by running "make install") install: avrdude -c usbtiny -p t13 -e -U flash:w:sample_led_program.rom # command to clean up junk (no source files) (invoked by "make clean") clean: rm -f *.o *.rom *.elf *.map *~

Slide 51: # Makefile for sample_led_program for ATtiny13 chip # Note: to use makefile with a different chip change all # mmcu statements (-mmcu=attiny13) to reflect new chip # also change the part option (-p t13) for the avrdude install command # default target when "make" is run w/o arguments Use avr-objcopy to create rom from elf file all: sample_led_program.rom # compile sample_led_program.c into sample_led_program.o sample_led_program.o: sample_led_program.c avr-gcc -c -g -O0 -Wall -mmcu=attiny13 sample_led_program.c -o sample_led_program.o # link up sample_led_program.o into sample_led_program.elf sample_led_program.elf: sample_led_program.o avr-gcc sample_led_program.o -Wall,-nm,-Map=sample_led_program.map,--cref - mmcu=attiny13 -o sample_led_program.elf # copy ROM (FLASH) object out of sample_led_program.elf into sample_led_program.rom sample_led_program.rom: sample_led_program.elf avr-objcopy -O ihex sample_led_program.elf sample_led_program.rom # command to program chip (invoked by running "make install") install: avrdude -c usbtiny -p t13 -e -U flash:w:sample_led_program.rom # command to clean up junk (no source files) (invoked by "make clean") clean: rm -f *.o *.rom *.elf *.map *~

Slide 52: # Makefile for sample_led_program for ATtiny13 chip # Note: to use makefile with a different chip change all # mmcu statements (-mmcu=attiny13) to reflect new chip # also change the part option (-p t13) for the avrdude install command # default target when "make" is run w/o arguments Use avrdube and a all: sample_led_program.rom usbtiny to copy to the # compile sample_led_program.c into sample_led_program.o sample_led_program.o: sample_led_program.c ATtiny13 chip avr-gcc -c -g -O0 -Wall -mmcu=attiny13 sample_led_program.c -o sample_led_program.o # link up sample_led_program.o into sample_led_program.elf sample_led_program.elf: sample_led_program.o avr-gcc sample_led_program.o -Wall,-nm,-Map=sample_led_program.map,--cref - mmcu=attiny13 -o sample_led_program.elf # copy ROM (FLASH) object out of sample_led_program.elf into sample_led_program.rom sample_led_program.rom: sample_led_program.elf avr-objcopy -O ihex sample_led_program.elf sample_led_program.rom # command to program chip (invoked by running "make install") install: avrdude -c usbtiny -p t13 -e -U flash:w:sample_led_program.rom # command to clean up junk (no source files) (invoked by "make clean") clean: rm -f *.o *.rom *.elf *.map *~

Slide 53: # Makefile for sample_led_program for ATtiny13 chip # Note: to use makefile with a different chip change all # mmcu statements (-mmcu=attiny13) to reflect new chip # also change the part option (-p t13) for the avrdude install command # default target when "make" is run w/o arguments Clean up the files all: sample_led_program.rom # compile sample_led_program.c into sample_led_program.o created sample_led_program.o: sample_led_program.c avr-gcc -c -g -O0 -Wall -mmcu=attiny13 sample_led_program.c -o sample_led_program.o # link up sample_led_program.o into sample_led_program.elf sample_led_program.elf: sample_led_program.o avr-gcc sample_led_program.o -Wall,-nm,-Map=sample_led_program.map,--cref - mmcu=attiny13 -o sample_led_program.elf # copy ROM (FLASH) object out of sample_led_program.elf into sample_led_program.rom sample_led_program.rom: sample_led_program.elf avr-objcopy -O ihex sample_led_program.elf sample_led_program.rom # command to program chip (invoked by running "make install") install: avrdude -c usbtiny -p t13 -e -U flash:w:sample_led_program.rom # command to clean up junk (no source files) (invoked by "make clean") clean: rm -f *.o *.rom *.elf *.map *~

Slide 55: Call the Makefile

Slide 56: Call the Install part of Makefile which calls avrdude

Slide 57: Run avrdude, it reads the rom, writes it to the chip and verifies this process

Slide 58: Sources for Parts Hacking / Disassembly use existing high-tech, but inexpensive, objects, toys and devices as cheap source of parts for your projects little specialist knowledge is required, photograph and document the disassembly ``Low tech sensors and actuators for artists and architects’’ provides examples, by Usman Haque and Adam Somlai-Fischer Purchase / Stores Many parts are available locally in UL, ask. Online vendors for electronic parts include farnell.com, mouser.com, and digikey.com Sensors, shields, kits, servos can also be found from sparkfun.com or parallax.com Many others, just small selection that I’ve used.

Slide 59: Things To Remember Safety first, last, and always do not take another person’s work about the state of a piece of equipment, always check yourself and make sure its safe for you to work use the right tool for the job treat each tool with respect and rack them back in their correct place when they are not in use, don’t leave a dangerous tool loose when it can harm somebody else don’t leave your safety glasses on the bench or in your pocket don’t work on a live circuit, turn the power off first don’t solder in an enclosed area without proper ventilation read the datasheet first and double check it to be sure get twice or three times the number of parts that you need for your circuit, you will make mistakes and sometimes you will have to throw an almost finished piece away