You are on page 1of 44

TABLE OF CONTENTS

Chapter No

Chapter 1
1. Introduction .3
1.1. Line follower ................................................................................4
1.2. Importance of line follower5
1.3. Background6
Chapter 2
2. The ATMEGA 16 microcontroller7
2.1 IC L 293...10
2.2 LED..13
2.3 Component used..14
2.4 Block diagram..21
Chapter 3
3.Overview.22
3.1. The Algorithm ...24
Chapter 4
4.1 Implement sensor circuit26
4 Constructions28
4.1 Working.30
4.4 Motor Interface and Control Circuit..31
1

Chapter 5
5. Possible Improvements41
References and Resources ..42
Books and Links

Chapter 1

Introduction

A line following robot is a mobile machine employed to sense and follow the black lines that
are drawn on the white surface. As this robot is developed using a breadboard, it will be very
simple to construct. This technique can be incorporated into the Automated Guided Vehicles
(AGV) for providing the easy way of operation.
Generally, the AGV is integrated with the microprocessor and computers for controlling its
system. It also uses a position feedback system for traveling in the desired path. In addition,
the electric signals and RF communication are needed for communicating with the vehicle
and system controller. Such awkward functions are completely not required in this line
following robot, and it just uses the IR sensors to travel on the black lines

1.1 Line follower

Line follower is a machine that can follow a path. The path can be visible like a black
Line on a white surface (or vice-versa) or it can be invisible like a magnetic field. It is a
machine that follows a line, either a black line on white surface or vise-versa. For Beginners
it is usually their first robot to play with. In this tutorial, we will teach you to make the line
follower robot move on the line with a type of feedback mechanism. Its the most basic
example of adding small intelligence to a robot, but its actually the designers intelligence!!
After reading this section completely you will be playing with the one shown below.
Moreover we will make it modular so that it can be easily modified in future.
The main electronics/mechanical components that will be used in making this line follower
robot are two sensors made using LDRs, transistors as motor driver circuit, acrylic sheet,
General purpose board, Two DC motors and battery. Line-following robots with pick-andplacement capabilities are commonly used in manufacturing plants. These move on a
specified path to pick the components from specified locations and place them on desired
locations.
Basically, a line-following robot is a self-operating robot that detects and follows a line
drawn on the floor. The path to be taken is indicated by a white line on a black surface. The
control system used must sense the line and maneuver the robot to stay on course
while constantly correcting the wrong moves using feedback mechanism, thus forming a
simple yet effective closed-loop system.

1.2Importance of line follower

Sensing a line and manoeuvring the robot to stay on course, while constantly correcting
Wrongmoves using feedback mechanism forms a simple yet effective closed loop
System. As a programmer you get an opportunity to teach the robot how to follow the
line thus giving it a human-like property of responding to stimuli.

Practical applications of a line follower: Automated cars running on roads with


embeddedmagnetsguidance system for industrial robots moving on shop floor etc.

1.3Background:

We started with building a parallel port based robot which could be controlled manually. On
the robot side was an arrangement of relays connected to parallel port pins via opto-couplers.
The next version was a true computer controlled line follower. It had sensors connected to the
status pins of the parallel port. A program running on the computer
Polled the status register of the parallel port hundreds of times every second and sent
Control signals accordingly through the data pins.
The drawbacks of using a personal computer were soon clear
Its difficult to control speed of motors
As cable length increases signal strength decreases and latency increases.
A long multi core cable for parallel data transfer is expensive.
The robot is not portable if you use a desktop PC.

The obvious next step was to build an onboard control circuit; the options was hardwired
logic circuit or an uC. Since I had no knowledge of uC at that time, I implementeda
hardwired logic circuit using multiplexers. It basically mapped input from four sensors to
four outputs for the motor driver according to a truth table. Though it worked fine, it could
show no intelligence like coming back on line after losing it, or doing something special
when say the line ended. To get around this problem and add some cool features, using a
microcontroller was the best option. Line Follower

Chapter 2

The ATMEGA 16microcontroller:

VCC: Digital supply voltage. (+5V)


GND: Ground. (0 V) Note there are 2 ground Pins.
Port A (PA7 - PA0) Port A serves as the analog inputs to the A/D Converter. Port A also serves
as an 8-bit bi-directional I/O port, if the A/D Converter is not used. When pins PA0 to PA7
are used as inputs and are externally pulled low, they will source current if the internal pullup resistors are activated. The Port apins are tri-stated when a reset condition becomes active,
even if the clock is not running.
Port B (PB7 - PB0) Port B is an 8-bit bi-directional I/O port with internal pull-up resistors
(selected for each bit). Port B also serves the functions of various special features of the
ATmega16 as listed on page 58 of datasheet.
Port C (PC7 - PC0) Port C is an 8-bit bi-directional I/O port with internal pull-up resistors
(selected for each bit). Port C also serves the functions of the JTAG interface and other
special features of the ATmega16 as listed on page 61 of datasheet. If the JTAG interface is
enabled, the pull-up resistors on pins PC5 (TDI), PC3 (TMS) and PC2 (TCK) will be
activated even if a reset occurs
Port D (PD7 - PD0) Port D is an 8-bit bi-directional I/O port with internal pull-up resistors
(selected for each bit). Port D also serves the functions of various special features of the
ATmega16 as listed on page 63 of datasheet.
RESET: Reset Input. A low level on this pin for longer than the minimum pulse length will
generate a reset, even if the clock is not running
XTAL1: External oscillator pin 1
7

XTAL2: External oscillator pin 2


AVCC: AVCC is the supply voltage pin for Port A and the A/D Converter. It should be
externally connected to VCC, even if the ADC is not used. If the ADC is used, it should be
connected to VCC through a low-pass filter.
AREF: AREF is the analog reference pin for the A/D Converter.

All 40 pin are output pins all pins are taking input as well as output. port a has special use it
can be use as analog to digital convertor. ADC work by taking a reference value in between
0-5v any value above the reference is considered 1 as high and 0 as low .
Pin 10.30= 5vcc (input voltage)
Pin 11.31= ground

Pin 12.13= crystal oscillator use for controlling frequency.


Pin 32= it gives the reference voltage for ADC it isinternally set as 2.65v

Fig 1
At mega 16 pin diagram

IC L293

L293D is a dual motor H bridge driver integrated circuit (IC). Motor drivers act signal. This
higher current signal is used to drive the motors.
L293D contains two inbuilt H-bridge driver circuits. In its common mode of operation, two
DC motors can be driven simultaneously, both in forward and reverse direction. The motor
operations of two motors can be controlled by input logic at pins 2 & 7 and 10 & 15. Input
logic 00 or 11 will stop the corresponding motor. Logic 01 and 10 will rotate it in clockwise
and anticlockwise directions, respectively.
Enable pins 1 and 9 (corresponding to the two motors) must be high for motors to start
operating. When an enable input is high, the associated driver gets enabled. As a result, the
outputs become active and work in phase with their inputs. Similarly, when the enable input
is low, that driver is disabled, and their outputs are off and in the high-impedance state.

10

Fig: 2
L293D pin diagram

11

PIN 1 = enable pin for motor 1


PIN 2 = input 1 for motor 1
PIN 3 = output 1 for motor 1
PIN 4 = ground (0v)
PIN 5 = ground (0v)
PIN 6 = output 2 for motor 1
PIN 7 = input 2 for motor 1
PIN 8 = supply voltage for motors;9-12v(up to 36v)
PIN 9 = enable pin for motor 2
PIN 10 = input 1 for motor 1
PIN 11 = output 1 for motor 1
PIN 12 = ground (0v)
PIN 13 = ground (0v)
PIN 14 = output 2 for motor 1
PIN 15 = input 2 for motor 1
PIN 16 = supply voltage; 5v(up to 36)

12

LED

LEDs are used for the testing of the circuits and as well for debugging. In cases where the
voltage changes from 0V to 5V and back to 0V, LEDs are useful because a multimeter cannot
be used for such purpose and the circuits can be tested just by checking the glowing of the
LEDs. The Cathode terminal of the LED is connected to the ground and anode to 5V. The
cathode terminal can be identified by looking into the LED and seeing which side is thicker
as can be seen in the figure.

Fig: 3
LED

13

2.1Component used

Chassis:

Chassis, basically the frame of the robot on which motors and wheels are mounted and all the
circuitry part is also placed on it.

Fig 4

14

Caster wheel
A Caster wheel is an undriven, single wheel that is designed to be mounted to the bottom of a
larger object so as to enable that object to be easily moved. They are available in various
sizes, and are commonly made of rubber, plastic, nylon, aluminum,or stainlesssteel,etc.

Fig 6

Wheel:
Wheel is a circular object that revolves on an axle and is fixed below a vehicle or other object
to enable it to move over the ground.

Fig: 7
15

DC MOTOR
DC Motors convert electrical energy (voltage or power source) to mechanical energy
(produce rotational motion). They run on direct current.

Fig 8

16

Source:

An ideal voltage source is a voltage source that maintains the same voltage across the
source's terminals no matter what current is drawn from the terminals of the source or what
current flows into the terminals.

DC source:
Direct current (DC) is the unidirectional flow of electric charge. Direct current is produced by
sources such as batteries, solar cells, and commutator-type electric machines of the dynamo
type, etc.

Voltage Regulator
Usually the motors used in the bot require a supply voltage of 12V while most of the circuitry
requires 5V. In order to avoid the usage of two separate batteries an electronic component
called voltage regulator is used. Voltage regulator can be defined as a component which is
used to convert certain fixed voltage levels into some other voltages. Thus in our case we will
be using a voltage regulator which can convert 12V into 5V. One such voltage regulator is
LM7805.

17

Fig 9

The top part of the figure above shows the LM7805 with the pins 1,2 and 3. In the schematic
shown the input corresponds to Pin 1, GND to Pin 2 and output to Pin 3. This implies that if
12V is applied at pin 1(i.e. it is connected to the positive terminal of the battery) and the pin 2
is grounded (i.e. it is connected to negative terminal of the battery) pin 3 will give a 5V
output. The regulator works even without the capacitors but it is better if capacitors are used
as they cut down the voltage fluctuations.

18

IC7805
IC 7805 is a 5V Voltage Regulator that restricts the voltage output to 5V and draws 5V
regulated power supply.

Fig 10

19

SENSOR:

IR reflective sensors have one emitter (IR LED) and one receiver (Phototransistor or photo
diode. If we have white surface it reflects the light and it will sensed by the receiver, similarly
if we have black surface it absorbs the light and receiver can not sense light.
Photo diode has property that if IR light fall on it its electrical resistance comes down (i.e. it
comes down from 150k to 10k if no noise present).

Fig 11

The sensors use for line detecting in a line-follower bot are IR sensors. These sensors have a
pair of transmitter and receiver when the sensor is on a reflecting surface (white) the light
transmitted by the transmitter is detected by the receiver and when the sensor is on black
surface or a non-reflecting surface exactly opposite happens.. The figure on the right side
shows the assembled sensor. These readymade sensors are directly available in the market.
Making the sensor from the T-R pair will not be explained in this tutorial.

20

Block Diagram

Fig 12
The basic principle involved in this is it captures the line position with IR sensors mounted at
front end of the robot. The block diagram of the line follower robot shows that, when the
sensor senses the path, output will be 0s or 1s which are then fed to the microcontroller, and
then the microcontroller decides the next move according to the program. When both the
sensors are indicating low (0) then robot start moving on the black path, for white if it
indicates high (1) then it moves along the path.

21

Chapter 3

OVERVIEW

Fig 13

The robot uses IR sensors to sense the line, an array of 8 IR LEDs (Tx) and sensors (Rx),
facing
The ground has been used in this setup. The output of the sensors is an analog signal which

22

Depends on the amount of light reflected back, this analog signal is given to the comparator
to produce 0s and 1s which are then fed to the uC.

L4 L3 L2 L1 R1 R2 R3 R4
Left Centre Right
Sensor Array

Starting from the centre, the sensors on the left are named L1, L2, L3, L4 and those on the
right are named R1, R2, R3, and R4.
Let us assume that when a sensor is on the line it reads 0 and when it is off the line it reads 1

The uC decides the next move according to the algorithm given below which tries to position
the robot such that L1 and R1 both read 0 and the rest read 1.

L4 L3 L2 L1 R1 R2 R3 R4
11100111
Left Centre Right
Desired State L1=R1=0, and Rest=1 Line Follower

23

Algorithm:

1. L= leftmost sensor which reads 0; R= rightmost sensor which reads 0.


If no sensor on Left (or Right) is 0 then L (or R) equals 0;
Ex:

Left centre Right


Here L=3 R=0

Left centre Right


Here L=2 R=4
2. If all sensors read 1 go to step 3,
else,
If L>R Move Left
If L<R Move Right
If L=R Move Forward
Goto step 4

24

3. Move clockwise if line was last seen on Right


Move counterclockwise if line was last seen on Left
Repeat step 3 till line is found.

4. Goto step 1.

L4 L3 L2 L1 R1 R2 R3 R4
10011111
L4 L3 L2 L1 R1 R2 R3 R4
1 1 0 0 0 0 0 0 Line Follower

25

Chapter 4:

Implementation

4.1Sensor Circuit:

Fig 14

The resistance of the sensor decreases when IR light falls on it. A good sensor will have near
zero resistance in presence of light and a very large resistance in absence of light.

26

We have used this property of the sensor to form a potential divider. The potential at point 2
is
Rsensor / (R Sensor + R1).
Again, a good sensor circuit should give maximum change in potential at point 2 for nolight and bright-light conditions. This is especially important if you plan to use an ADC in
place of the comparator
To get a good voltage swing, the value of R1 must be carefully chosen. If Rsensor = a when
no light falls on it and Rsensor = b when light falls on it. The difference in the two potentials
is:

Vcc * {a/ (a+R1) - b/ (b+R1)}


Relative voltage swing = Actual Voltage Swing / Vcc

= Vcc * {a/ (a+R1) - b/ (b+R1)} / Vcc


= a/ (a+R1) - b/ (b+R1)

The sensor I used had a = 930 K and b = 36 K. If we plot a curve of the voltage swing over a
range of values of R1 we can see that the maximum swing is obtained at R1= 150 K (use
calculus for an accurate value).
There is a catch though, with such high resistance, the current is very small and hence
susceptible to be distorted by noise. The solution is to strike a balance between sensitivity and
noise immunity. I chose value of R1 as 60 K. Your choice would depend on the a and b
values of your sensor.
If you found this part confusing, use a 10K resistor straightaway, as long as you are using a
comparator it wont matter much.

27

CONSTRUCTION:
Its a most basic example of adding small intelligence to a robot but its actually a designers
intelligence.
In construction of line follower robot using at mega 16 the component used are:
At mega 16 microcontroller
L293 motor driver IC
IR sensor
Voltage regulator
DC motor 100 rpm
Wheel
Caster (front) wheel
LED
Current input port ( jack )
Touch (resistive)
LCD

28

HOW TO CONSTRUCT:
We will be using two wheels differential driver using two motor and one caster wheel. The
direction of the speed of two motor control independently.
We will using a light sensor particularly light dependent resister to detect black line on white
surface. The sensor part fixed in front of chassis, facing down word.
First the input current of 12v given to jack( input current port) after that current goes to
voltage regulator, it convert the current 12v to 5v because at mega 16 need only 5v current.
output current of 5v connect to pin 1(En1,2)and pin 16 (vcc) of L239 motor driver IC. In
L239 motor driver IC pin 4, 5 and 12,13 are grounded and connect with the ground pin of
voltage regulator. Pin 3, 7 and 11, 14 are use for run the DC motor. Pin 9 connect to 12v
source and pin 5 connect with 5v source.pin 2,7 and 10,15 of L293 motor driver IC connect
with pin 19,20 and 17,18 of at mega 16 microcontroller.
In at mega 16 port A pin PA0 to PA3 connect with the four wire resistive touch.pin 4and pin 6
connect with the IR sensor. Port C pin PC7 to PC4 and PC2 to PC0 are connect with LCD. In
LCD to pin are grounded and one pin connect with 5v grounded pin are short with ground
port of voltage regulator and 5v pin are short with 5v pin.
In this circuit use LED with resistor and diode .when LED is blinked means current passing
in circuit.

29

WORKING:

The working model of line follower consist of two motor , one ATmega16 microcontroller ,
two wheel , two IR sensor , LED , wire , touch , LCD , and power supply.
The IR sensor gets the input and according to the program the LED glows depending on the
input. The two motor rotate together in one direction to go forward or backward. For taking a
right turn, the motor at right side stop and left side one continues to rotate. This rotation
depends on the program which gives instruction to the motor depending on the input a d
sensor give.

IR sensor provides the input, motor give the output and the wheel make the robot to follow a
line.
Forward robot is a mobile machine that can follow a path. The path can be visible black line
on a white surface.
The IR sensor receivesan analog signal that depends on the intensity of light reflected by the
black line of emitted beam by the LED.
These signals are sent to the ADC comparator which creates digital signal that are sent by
microcontroller.
The microcontroller gives instruction to motor to perform work.

30

4.2Motor Interface and Control Circuit:

The 8 sensors are connected to PORTA.


You need not connect anything to AVCC and AREF, it is required only if ADC is used.

The L293 Motor Driver has 4 inputs to control the motion of the motors and two enable
inputs which are used for switching the motors on and off. To control the speed of the motors
a PWM waveform with variable duty cycle is applied to the enable pins. Rapidly switching
the voltage between Vs. and GND gives an effective voltage between Vs and GND whose
value depends on the duty cycle of PWM. 100% duty cycle corresponds to voltage equal to
Vs, 50 % corresponds to 0.5Vs and so on. The 1N4004 diodes are used to prevent back EMF
of the motors from disturbing the remaining circuit. Many circuits use L293D for motor
control, I chose L298 as it has current capacity of 2A per channel @ 45V compared to 0.6 A
@ 36 V of a L293D. L293Ds package is not suitable for attaching a good heat sink,
practically you cant use it above 16V Line Followerwithout frying it. L293 on the other hand
works happily at 16V without a heat sink, though it is always better to use one.

31

Chip type: ATmega16


Program type: Application
Clock frequency: 7.372800 MHz
Memory model: Small
External SRAM size: 0
Data Stack size: 256

//#define debug 1
#include <mega16.h>
#include <delay.h>
#ifdef debug
#include <stdio.h>
#endif

#define FWD 0xAA


#define REV 0x55
#define R 0x22
#define L 0x88
#define CW 0x99
#define CCW 0x66
32

#define STOP 0x00


#define B 0xFF
#define RSPEED OCR1AL
#define LSPEED OCR1BL
#define SPEED0 255
#define SPEED1 0
#define SPEED2 0
#define SPEED3 0
#define MAX 3
#define HMAX 1

Void move (unsigned char dir, unsigned char delay, unsigned char power);
unsigned char i,rdev,ldev,ip,delay,dir,power,dirl,history[MAX],hcount=0,rotpow;
#ifdef debug
Unsigned char rep=0, prev=0;
#endif
Voidmain (void)
{
// Input/output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In Line
Follower
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
33

PORTA=0x00;
DDRA=0x00;
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;
// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0xFF;
// Port D initialization
// Func7=In Func6=In Func5=Out Func4=Out Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=0 State4=0 State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x30;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
34

TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 921.600 kHz
// Mode: Fast PWM top=00FFh
// OC1A output: Non-Inv.
// OC1B output: Non-Inv.
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR1A=0xA1;
TCCR1B=0x0A;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0xFF;
OCR1BH=0x00;
OCR1BL=0xFF;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
35

// Mode: Normal top=FFh


// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00; Line Follower
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;
#ifdef debug
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 57600
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
36

UBRRL=0x07;
#endif
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

While (1){

#ifdef debug
If (rep<255)
rep++;
If(prev! =PINA) {
prev=PINA;
Printf ("%u\r", rep);
For(i=0; i<8;i++)
print ("%u\t", (prev>>i) &0x01);
rep=0;
}
#endif
37

if (PINA! =255)
{
rotpow=255;
ldev=rdev=0;
if(PINA.3==0)
rdev=1;
if(PINA.2==0)
rdev=2;
if(PINA.1==0)
rdev=3;

if(PINA.0==0)
rdev=4;
if(PINA.4==0)
ldev1;
if(PINA.5==0)
ldev=2;
if(PINA.6==0)
ldev=3;
if(PINA.7==0)
ldev=4;
38

if(rdev>ldev)
move(R, 0,195+12*rdev);
if(rdev<ldev)
move(L, 0,195+12*ldev);
if(rdev==ldev)
move (FWD, 0,200);
}
else {
for (i=0, dirl=0; i<MAX;i++) {
if (history[i]==L)
{dirl++ ;}
}
If(rotpow<160) {rotpow=160 ;}
If(rotpow<255) {rotpow++ ;}
If(dirl>HMAX)
{move (CW,0,rotpow);}
else
{move (CCW, 0,rotpow) ;}
}
};
}
void move (unsigned char dir, unsigned char delay, unsigned char power) {
PORTC=dir;
39

If(dir==L || dir==R) {
hcount= (hcount+1) %MAX;
history[hcount] =dir.;
}
LSPEED=RSPEED=255; //power;
//delay_ms(delay);
}

40

Possible Improvements:

-Use of differential steering with gradual change in wheel speeds.


-Use of Hysteresis in sensor circuit using LM339
-Use of ADC so that the exact position of the line can be interpolated
-Use of Wheel Chair or three wheel drive to reduce traction.
-General improvements like using a low dropout voltage regulator, lighter chassis etc Line
Follower

41

References and Resources

Books:
Programming and Customizing the AVR Microcontroller Dhananjay V. Gadre
Parallel Port Complete Jan Axelson

Links:
Atmel Corp.
Makers of the AVR microcontroller
http://www.atmel.com

AVRbeginners.net
http://www.avrbeginners.net/

AVR assembler tutorial


Tutorial for learning assembly language for the AVR-Single-Chip-Processors
AT90Sxxxx from ATMEL with practical examples.
http://www.avr-asm-tutorial.net/

42

One of the best sites AVR sites


http://www.avrfreaks.net

WinAVR
An open source C compiler for AVR
http://sourceforge.net/projects/winavr

PonyProg
A widely used programmer. Support for newer chips is added periodically. Can also
Program PICs and EEPROMS
http://www.lancos.com/prog.html

Basic Electronics
http://www.kpsec.freeuk.com/

Williamson Labs
Nice animated tutorials, articles and project ideas.
http://www.williamson-labs.com/home.htm

Small Robot Sensors


http://www.andrew.cmu.edu/user/rjg/websensors/robot_sensors2.html

Robotics India
43

An Indian site devoted to robotics. Must see


http://www.roboticsindia.com/
Seattle Robotics Society
http://www.seattlerobotics.org/

44

You might also like