3 Physical Output
3 Physical Output
Physical Output
8.0 Introduction
<RX FDQ PDNH WKLQJV PRYH E\ FRQWUROOLQJ PRWRUV ZLWK $UGXLQR 'LIIHUHQW W\SHV RI
PRWRUVVXLWGLIIHUHQWDSSOLFDWLRQVDQGWKLVFKDSWHUVKRZVKRZ$UGXLQRFDQGULYHPDQ\
GLIIHUHQWNLQGVRIPRWRUV
261
)LJXUH(OHPHQWVLQVLGHDKREE\VHUYR
$OWKRXJK WKH GXUDWLRQ RI WKH SXOVH LV PRGXODWHG FRQWUROOHG VHUYRV
UHTXLUH SXOVHV WKDW DUH GLIIHUHQW IURP WKH 3XOVH :LGWK 0RGXODWLRQ
3:0RXWSXWIURP analogWrite<RXFDQGDPDJHDKREE\VHUYRE\
FRQQHFWLQJ LW WR WKH RXWSXW IURP analogWriteXVH WKH 6HUYR OLEUDU\
LQVWHDG
Stepper Motors
6WHSSHUVDUHPRWRUVWKDWURWDWHDVSHFLILFQXPEHURIGHJUHHVLQUHVSRQVHWRFRQWURO
SXOVHV7KHQXPEHURIGHJUHHVLQHDFKVWHSLVPRWRUGHSHQGHQWUDQJLQJIURPRQHRU
WZRGHJUHHVSHUVWHSWRGHJUHHVRUPRUH
7ZRW\SHVRIVWHSSHUVDUHFRPPRQO\XVHGZLWK$UGXLQRELSRODUW\SLFDOO\ZLWKIRXU
OHDGVDWWDFKHGWRWZRFRLOVDQGXQLSRODUILYHRUVL[OHDGVDWWDFKHGWRWZRFRLOV7KH
DGGLWLRQDOZLUHVLQDXQLSRODUVWHSSHUDUHLQWHUQDOO\FRQQHFWHGWRWKHFHQWHURIWKHFRLOV
LQWKHILYHOHDGYHUVLRQHDFKFRLOKDVDFHQWHUWDSDQGERWKFHQWHUWDSVDUHFRQQHFWHG
WRJHWKHU7KHUHFLSHVFRYHULQJELSRODUDQGXQLSRODUVWHSSHUVKDYHGLDJUDPVLOOXVWUDWLQJ
WKHVHFRQQHFWLRQV
Solution
8VHWKH6HUYROLEUDU\GLVWULEXWHGZLWK$UGXLQR&RQQHFWWKHVHUYRSRZHUDQGJURXQG
WR D VXLWDEOH SRZHU VXSSO\ D VLQJOH KREE\ VHUYR FDQ XVXDOO\ EH SRZHUHG IURP WKH
$UGXLQR9OLQH5HFHQWYHUVLRQVRIWKHOLEUDU\HQDEOH\RXWRFRQQHFWWKHVHUYRVLJQDO
OHDGVWRDQ\$UGXLQRGLJLWDOSLQ
+HUH LV WKH H[DPSOH 6ZHHS VNHWFK GLVWULEXWHG ZLWK $UGXLQR )LJXUH VKRZV WKH
FRQQHFWLRQV
#include <Servo.h>
void setup()
{
myservo.attach(9); // attaches the servo on pin 10 to the servo object
}
void loop()
{
for(angle = 0; angle < 180; angle += 1) // goes from 0 degrees to 180 degrees
{ // in steps of 1 degree
myservo.write(angle); // tell servo to go to position in variable 'angle'
delay(20); // waits 20ms between servo commands
}
for(angle = 180; angle >= 1; angle -= 1) // goes from 180 degrees to 0 degrees
{
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(20); // waits 20ms between servo commands
}
}
Discussion
7KLVH[DPSOHVZHHSVWKHVHUYREHWZHHQDQGGHJUHHV<RXPD\QHHGWRWHOOWKH
OLEUDU\WRDGMXVWWKHPLQLPXPDQGPD[LPXPSRVLWLRQVVRWKDW\RXJHWWKHUDQJHRI
PRYHPHQW\RXZDQW&DOOLQJServo.attachZLWKRSWLRQDODUJXPHQWVIRUPLQLPXPDQG
PD[LPXPSRVLWLRQVZLOODGMXVWWKHPRYHPHQW
myservo.attach(9,1000,2000 ); // use pin 9, set min to 1000us, max to 2000us
%HFDXVHW\SLFDOVHUYRVUHVSRQGWRSXOVHVPHDVXUHGLQPLFURVHFRQGVDQGQRWGHJUHHV
WKHDUJXPHQWVIROORZLQJWKHSLQQXPEHULQIRUPWKH6HUYROLEUDU\KRZPDQ\PLFUR
VHFRQGVWRXVHZKHQGHJUHHVRUGHJUHHVDUHUHTXHVWHG1RWDOOVHUYRVZLOOPRYH
RYHUDIXOOGHJUHHUDQJHVR\RXPD\QHHGWRH[SHULPHQWZLWK\RXUVWRJHWWKHUDQJH
\RXZDQW
7KHSDUDPHWHUVIRUservo.attach(pin,min,max)DUHWKHIROORZLQJ
pin
7KHSLQQXPEHUWKDWWKHVHUYRLVDWWDFKHGWRPXVWEHRU
minRSWLRQDO
7KHSXOVHZLGWKLQPLFURVHFRQGVFRUUHVSRQGLQJWRWKHPLQLPXPGHJUHHDQJOH
RQWKHVHUYRGHIDXOWVWR
maxRSWLRQDO
7KHSXOVHZLGWKLQPLFURVHFRQGVFRUUHVSRQGLQJWRWKHPD[LPXPGHJUHH
DQJOHRQWKHVHUYRGHIDXOWVWR
3RZHUUHTXLUHPHQWVYDU\GHSHQGLQJRQWKHVHUYRDQGKRZPXFKWRUTXHLVQHHGHGWR
URWDWHWKHVKDIW
WKDWFDQEHUHDGIURPDQDQDORJLQSXW
Solution
7KHVDPHOLEUDU\FDQEHXVHGDVLQ5HFLSHZLWKWKHDGGLWLRQRIFRGHWRUHDGWKH
YROWDJHRQDSRWHQWLRPHWHU7KLVYDOXHLVVFDOHGVRWKDWWKHSRVLWLRQRIWKHSRWIURP
0WR1023LVPDSSHGWRDYDOXHEHWZHHQDQGGHJUHHV7KHRQO\GLIIHUHQFHLQWKH
ZLULQJLVWKHDGGLWLRQRIWKHSRWHQWLRPHWHUVHH)LJXUH
#include <Servo.h>
void setup()
{
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}
void loop()
{
val = analogRead(potpin); // reads the value of the potentiometer
val = map(val, 0, 1023, 0, 179); // scale it to use it with the servo
myservo.write(val); // sets position to the scaled value
delay(15); // waits for the servo to get there
}
Discussion
$Q\WKLQJWKDWFDQEHUHDGIURPanalogReadVHH&KDSWHUDQG&KDSWHUFDQEHXVHG
IRUH[DPSOHWKHJ\URDQGDFFHOHURPHWHUUHFLSHVLQ&KDSWHUFDQEHXVHGVRWKDWWKH
DQJOHRIWKHVHUYRLVFRQWUROOHGE\WKH\DZRIWKHJ\URRUDQJOHRIWKHDFFHOHURPHWHU
Solution
&RQWLQXRXVURWDWLRQVHUYRVDUHDIRUPRIJHDUUHGXFHGPRWRUZLWKIRUZDUGDQGEDFN
ZDUG VSHHG DGMXVWPHQW &RQWURO RI FRQWLQXRXV URWDWLRQ VHUYRV LV VLPLODU WR QRUPDO
VHUYRV7KHVHUYRURWDWHVLQRQHGLUHFWLRQDVWKHDQJOHLVLQFUHDVHGIURPGHJUHHVLW
URWDWHVLQWKHRWKHUGLUHFWLRQZKHQWKHDQJOHLVGHFUHDVHGIURPGHJUHHV7KHDFWXDO
GLUHFWLRQ IRUZDUG RU EDFNZDUG GHSHQGV RQ KRZ \RX KDYH WKH VHUYRV DWWDFKHG )LJ
XUHVKRZVWKHFRQQHFWLRQVIRUFRQWUROOLQJWZRVHUYRV
7KLVH[DPSOHVZHHSVWKHVHUYRVIURPWRGHJUHHVVRLIWKHVHUYRVZHUHFRQQHFWHG
WRZKHHOVWKHYHKLFOHZRXOGPRYHIRUZDUGDWDVORZO\LQFUHDVLQJSDFHDQGWKHQVORZ
void setup()
{
myservoLeft.attach(9); // attaches left servo on pin 9 to servo object
myservoRight.attach(10); // attaches right servo on pin 10 to servo object
}
void loop()
{
for(angle = 90; angle < 180; angle += 1) // goes from 90 to 180 degrees
{ // in steps of 1 degree
// 90 degrees is stopped
myservoLeft.write(angle); // rotate servo at speed given by 'angle'
myservoRight.write(180-angle); // go in the opposite direction
Solution
<RXFDQXVHVRIWZDUHWRFRQWUROWKHVHUYRV7KLVKDVWKHDGYDQWDJHWKDWDQ\QXPEHURI
VHUYRVFDQEHVXSSRUWHG+RZHYHU\RXUVNHWFKQHHGVWRFRQVWDQWO\DWWHQGWRUHIUHVKLQJ
WKHVHUYRSRVLWLRQVRWKHORJLFFDQJHWFRPSOLFDWHGDVWKHQXPEHURIVHUYRVLQFUHDVHV
LI\RXUSURMHFWQHHGVWRSHUIRUPDORWRIRWKHUWDVNV
7KLVUHFLSHGULYHVIRXUVHUYRVDFFRUGLQJWRFRPPDQGVUHFHLYHGRQWKHVHULDOSRUW7KH
FRPPDQGVDUHRIWKHIROORZLQJIRUP
180aZULWHVWRVHUYRD
90bZULWHVWRVHUYRE
0cZULWHVWRVHUYRF
17dZULWHVWRVHUYRG
+HUHLVWKHVNHWFKWKDWGULYHVIRXUVHUYRVFRQQHFWHGRQSLQVWKURXJK
#include <Servo.h> // the servo library
Servo myservo[SERVOS];
void setup()
{
Serial.begin(9600);
for(int i=0; i < SERVOS; i++)
myservo[i].attach(servoPins[i]);
}
void loop()
// serviceSerial checks the serial port and updates position with received data
// it expects servo data in the form:
// "180a" writes 180 to servo a
// "90b writes 90 to servo b
void serviceSerial()
{
static int pos = 0;
if ( Serial.available()) {
char ch = Serial.read();
Discussion
&RQQHFWLQJWKHVHUYRVLVVLPLODUWRWKHSUHYLRXVUHFLSHV(DFKVHUYROLQHZLUHJHWVFRQ
QHFWHGWRDGLJLWDOSLQ$OOVHUYRJURXQGVDUHFRQQHFWHGWR$UGXLQRJURXQG7KHVHUYR
SRZHUOLQHVDUHFRQQHFWHGWRJHWKHUDQG\RXPD\QHHGDQH[WHUQDO9RU9SRZHU
VRXUFHLI\RXUVHUYRVUHTXLUHPRUHFXUUHQWWKDQWKH$UGXLQRSRZHUVXSSO\FDQSURYLGH
$QDUUD\QDPHGmyservoVHH5HFLSHLVXVHGWRKROGUHIHUHQFHVIRUWKHIRXUVHUYRV
$forORRSLQsetupDWWDFKHVHDFKVHUYRLQWKHDUUD\WRFRQVHFXWLYHSLQVGHILQHGLQWKH
servoPinsDUUD\
,IWKHFKDUDFWHUUHFHLYHGIURPVHULDOLVDGLJLWWKHFKDUDFWHUZLOOEHJUHDWHUWKDQRUHTXDO
WR]HURDQGOHVVWKDQRUHTXDOWRLWVYDOXHLVDFFXPXODWHGLQWKHYDULDEOHpos,IWKH
FKDUDFWHULVWKHOHWWHUDWKHSRVLWLRQLVZULWWHQWRWKHILUVWVHUYRLQWKHDUUD\WKHVHUYR
FRQQHFWHGWRSLQ7KHOHWWHUVEFDQGGFRQWUROWKHVXEVHTXHQWVHUYRV
See Also
6HH&KDSWHUIRUPRUHRQKDQGOLQJYDOXHVUHFHLYHGRYHUVHULDO
Solution
7KLVVNHWFKXVHVWKHVDPHFRGHDV5HFLSH7KHZLULQJLVVLPLODUH[FHSWIRUWKHVSHHG
FRQWUROOHUDQGPRWRU%UXVKOHVVPRWRUVKDYHWKUHHZLQGLQJVDQGWKHVHVKRXOGEHFRQ
QHFWHGIROORZLQJWKHLQVWUXFWLRQVIRU\RXUVSHHGFRQWUROOHUVHH)LJXUH
)LJXUH&RQQHFWLQJDQHOHFWURQLFVVSHHGFRQWUROOHU
Discussion
&RQVXOWWKHGRFXPHQWDWLRQIRU\RXUVSHHGFRQWUROOHUWRFRQILUPWKDWLWLVVXLWDEOHIRU
\RXUEUXVKOHVVPRWRUDQGWRYHULI\WKHZLULQJ%UXVKOHVVPRWRUVKDYHWKUHHFRQQHFWLRQV
IRUWKHWKUHHPRWRUZLUHVDQGWZRFRQQHFWLRQVIRUSRZHU0DQ\VSHHGFRQWUROOHUVSUR
YLGHSRZHURQWKHFHQWHUSLQRIWKHVHUYRFRQQHFWRU8QOHVV\RXZDQWWRSRZHUWKH
$UGXLQRERDUGIURPWKHVSHHGFRQWUROOHU\RXPXVWGLVFRQQHFWRUFXWWKLVFHQWHUZLUH
,I\RXUVSHHGFRQWUROOHUKDVDIHDWXUHWKDWSURYLGHV9SRZHUWRVHUYRV
DQGRWKHUGHYLFHVFDOOHGDEDWWHU\HOLPLQDWRUFLUFXLWRU%(&IRUVKRUW
\RXPXVWGLVFRQQHFWWKLVZLUHZKHQDWWDFKLQJWKH$UGXLQRWRWKHVSHHG
FRQWUROOHUVHH)LJXUH
Solution
0RVWVROHQRLGVUHTXLUHPRUHSRZHUWKDQDQ$UGXLQRSLQFDQSURYLGHVRDWUDQVLVWRU
LVXVHGWRVZLWFKWKHFXUUHQWQHHGHGWRDFWLYDWHDVROHQRLG$FWLYDWLQJWKHVROHQRLGLV
DFKLHYHGE\XVLQJdigitalWriteWRVHWWKHSLQHIGH
7KLVVNHWFKWXUQVRQDWUDQVLVWRUFRQQHFWHGDVVKRZQLQ)LJXUH7KHVROHQRLGZLOO
EHDFWLYDWHGIRURQHVHFRQGHYHU\KRXU
int solenoidPin = 2; // Solenoid connected to transitor on pin 2
void setup()
{
pinMode(ledPin, OUTPUT);
}
void loop()
{
long interval = 1000 * 60 * 60 ; // interval = 60 minutes
digitalWrite(solenoidPin, HIGH); // activates the solenoid
delay(1000); // waits for a second
digitalWrite(ledPin, LOW); // deactivates the solenoid
delay(interval); // waits one hour
}
Discussion
7KHFKRLFHRIWUDQVLVWRULVGHSHQGHQWRQWKHDPRXQWRIFXUUHQWUHTXLUHGWRDFWLYDWHWKH
VROHQRLG RU UHOD\ 7KH GDWD VKHHW PD\ VSHFLI\ WKLV LQ PLOOLDPSHUHV P$ RU DV WKH
UHVLVWDQFHRIWKHFRLO7RILQGWKHFXUUHQWQHHGHGE\\RXUVROHQRLGRUUHOD\GLYLGHWKH
YROWDJHRIWKHFRLOE\LWVUHVLVWDQFHLQRKPV)RUH[DPSOHD9UHOD\ZLWKDFRLORI
RKPVGUDZVP$YROWVRKPV DPSVZKLFKLVP$
6PDOOWUDQVLVWRUVVXFKDVWKH1DUHVXIILFLHQWIRUVROHQRLGVUHTXLULQJXSWRDIHZ
KXQGUHGPLOOLDPSV/DUJHUVROHQRLGVZLOOUHTXLUHDKLJKHUSRZHUWUDQVLVWRUOLNHWKH
7,37,3RUVLPLODU7KHUHDUHPDQ\VXLWDEOHWUDQVLVWRUDOWHUQDWLYHVVHH$SSHQ
GL[%IRUKHOSUHDGLQJDGDWDVKHHWDQGFKRRVLQJWUDQVLVWRUV
7KHSXUSRVHRIWKHGLRGHLVWRSUHYHQWUHYHUVH(0)IURPWKHFRLOIURPGDPDJLQJWKH
WUDQVLVWRUUHYHUVH(0)LVDYROWDJHSURGXFHGZKHQFXUUHQWWKURXJKDFRLOLVVZLWFKHG
Solution
&RQQHFWDYLEUDWLRQPRWRUDVVKRZQLQ)LJXUH
7KHIROORZLQJVNHWFKZLOOWXUQRQWKHYLEUDWLRQPRWRUIRURQHVHFRQGHDFKPLQXWH
/*
* Vibrate sketch
* Vibrate for one second every minute
*
*/
void setup()
{
pinMode(motorPin, OUTPUT);
}
void loop()
{
digitalWrite(motorPin, HIGH); //vibrate
delay(1000); // delay one second
digitalWrite(motorPin, LOW); // stop vibrating
delay(59000); // wait 59 seconds.
}
Discussion
7KLVUHFLSHXVHVDPRWRUGHVLJQHGWRYLEUDWHVXFKDVWKH6SDUN)XQ52%,I\RX
KDYHDQROGFHOOSKRQH\RXQRORQJHUQHHGLWPD\FRQWDLQWLQ\YLEUDWLRQPRWRUVWKDW
ZRXOG EH VXLWDEOH 9LEUDWLRQ PRWRUV UHTXLUH PRUH SRZHU WKDQ DQ $UGXLQR SLQ FDQ
SURYLGHVRDWUDQVLVWRULVXVHGWRVZLWFKWKHPRWRUFXUUHQWRQDQGRII$OPRVWDQ\131
WUDQVLVWRUFDQEHXVHG)LJXUHVKRZVWKHFRPPRQ1VHHWKLVERRNVZHE
VLWHIRUVXSSOLHULQIRUPDWLRQRQWKLVDQGWKHRWKHUFRPSRQHQWVXVHG$NLORKPUH
VLVWRUFRQQHFWVWKHRXWSXWSLQWRWKHWUDQVLVWRUEDVHWKHYDOXHLVQRWFULWLFDODQG\RX
FDQXVHYDOXHVXSWRNLORKPRUVRWKHUHVLVWRUSUHYHQWVWRRPXFKFXUUHQWIORZLQJ
void setup()
{
pinMode(motorPin, OUTPUT);
sensorAmbient = analogRead(sensorPin); // get startup light level;
}
void loop()
{
int sensorValue = analogRead(sensorPin);
if( sensorValue > sensorAmbient + thresholdMargin)
{
digitalWrite(motorPin, HIGH); //vibrate
}
else
{
digitalWrite(motorPin, LOW); // stop vibrating
}
}
+HUHWKHRXWSXWSLQLVWXUQHGRQZKHQDOLJKWVKLQHVRQWKHSKRWRFHOO:KHQWKHVNHWFK
VWDUWV WKH EDFNJURXQG OLJKW OHYHO RQ WKH VHQVRU LV UHDG DQG VWRUHG LQ WKH YDULDEOH
sensorAmbient /LJKW OHYHOV UHDG LQ loop WKDW DUH KLJKHU WKDQ WKLV ZLOO WXUQ RQ WKH
YLEUDWLRQPRWRU
Solution
7KLVVNHWFKWXUQVWKHPRWRURQDQGRIIDQGFRQWUROVLWVVSHHGIURPFRPPDQGVUHFHLYHG
RQWKHVHULDOSRUW)LJXUHVKRZVWKHFRQQHFWLRQV
/*
* SimpleBrushed sketch
* commands from serial port control motor speed
* digits '0' through '9' are valid where '0' is off, '9' is max speed
*/
void setup()
{
Serial.begin(9600);
}
void loop()
{
if ( Serial.available()) {
char ch = Serial.read();
Discussion
7KLVUHFLSHLVVLPLODUWR5HFLSHWKHGLIIHUHQFHLVWKDWanalogWriteLVXVHGWRFRQWURO
WKHVSHHGRIWKHPRWRU6HH$QDORJ2XWSXWRQSDJHLQ&KDSWHUIRUPRUHRQ
analogWriteDQG3XOVH:LGWK0RGXODWLRQ3:0
Solution
$Q+%ULGJHFDQFRQWUROWZREUXVKHGPRWRUV)LJXUHVKRZVWKHFRQQHFWLRQVIRU
WKH/'+%ULGJH,&\RXFDQDOVRXVHWKH61ZKLFKKDVWKHVDPHSLQOD\RXW
/*
* Brushed_H_Bridge_simple sketch
* commands from serial port control motor direction
* + or - set the direction, any other key stops the motor
*/
void setup()
{
Serial.begin(9600);
pinMode(in1Pin, OUTPUT);
pinMode(in2Pin, OUTPUT);
Serial.println("+ - to set direction, any other key stops motor");
}
)LJXUH&RQQHFWLQJWZREUXVKHGPRWRUVXVLQJDQ/'+%ULGJH
)LJXUHVKRZVKRZDVHFRQGPRWRUFDQEHFRQQHFWHG7KHIROORZLQJVNHWFKFRQWUROV
ERWKPRWRUVWRJHWKHU
/*
* Brushed_H_Bridge_simple2 sketch
* commands from serial port control motor direction
* + or - set the direction, any other key stops the motors
*/
void setup()
{
Serial.begin(9600);
pinMode(in1Pin, OUTPUT);
pinMode(in2Pin, OUTPUT);
pinMode(in3Pin, OUTPUT);
pinMode(in4Pin, OUTPUT);
Serial.println("+ - sets direction of motors, any other key stops motors");
}
void loop()
{
if ( Serial.available()) {
char ch = Serial.read();
if (ch == '+')
digitalWrite(in3Pin,HIGH);
digitalWrite(in4Pin,LOW);
}
else
{
Serial.print("Stop motors");
digitalWrite(in1Pin,LOW);
digitalWrite(in2Pin,LOW);
digitalWrite(in3Pin,LOW);
digitalWrite(in4Pin,LOW);
}
}
}
Solution
&RQQHFWDEUXVKHGPRWRUWRWKHRXWSXWSLQVRIWKH+%ULGJHDVVKRZQLQ)LJXUH
7KLVVNHWFKXVHVFRPPDQGVIURPWKH6HULDO0RQLWRUWRFRQWUROWKHVSHHGDQGGLUHFWLRQ
RI WKH PRWRU 6HQGLQJ ZLOO VWRS WKH PRWRU DQG WKH GLJLWV WKURXJK ZLOO
FRQWUROWKHVSHHG6HQGLQJDQGZLOOVHWWKHPRWRUGLUHFWLRQ
/*
* Brushed_H_Bridge sketch
* commands from serial port control motor speed and direction
* digits '0' through '9' are valid where '0' is off, '9' is max speed
* + or - set the direction
*/
void setup()
{
Serial.begin(9600);
pinMode(in1Pin, OUTPUT);
pinMode(in2Pin, OUTPUT);
Serial.println("Speed (0-9) or + - to set direction");
}
void loop()
{
if ( Serial.available()) {
char ch = Serial.read();
8.10 Controlling the Direction and Speed of a Brushed Motor with an H-Bridge | 281
if(ch >= '0' && ch <= '9') // is ch a number?
{
int speed = map(ch, '0', '9', 0, 255);
analogWrite(enPin, speed);
Serial.println(speed);
}
else if (ch == '+')
{
Serial.println("CW");
digitalWrite(in1Pin,LOW);
digitalWrite(in2Pin,HIGH);
}
else if (ch == '-')
{
Serial.println("CCW");
digitalWrite(in1Pin,HIGH);
digitalWrite(in2Pin,LOW);
}
else
{
Serial.print("Unexpected character ");
Serial.println(ch);
}
}
}
Discussion
7KLVUHFLSHLVVLPLODUWR5HFLSHLQZKLFKPRWRUGLUHFWLRQLVFRQWUROOHGE\WKHOHYHOV
RQWKH,1DQG,1SLQV%XWLQDGGLWLRQVSHHGLVFRQWUROOHGE\WKHanalogWriteYDOXH
RQWKH(1SLQVHH&KDSWHUIRUPRUHRQ3:0:ULWLQJDYDOXHRI 0ZLOOVWRSWKH
PRWRUZULWLQJ255ZLOOUXQWKHPRWRUDWIXOOVSHHG7KHPRWRUVSHHGZLOOYDU\LQSUR
SRUWLRQWRYDOXHVZLWKLQWKLVUDQJH
Solution
7KLV6ROXWLRQXVHVVLPLODUPRWRUFRQQHFWLRQVWRWKRVHVKRZQLQ)LJXUHEXWZLWK
WKHDGGLWLRQRIWZROLJKWGHSHQGHQWUHVLVWRUVDVVKRZQLQ)LJXUH
7KHVNHWFKPRQLWRUVWKHOLJKWOHYHORQWKHVHQVRUVDQGGULYHVWKHPRWRUVWRVWHHUWRZDUG
WKHVHQVRUGHWHFWLQJWKHEULJKWHUOLJKWOHYHO
/*
* Brushed_H_Bridge_Direction sketch
* uses photo sensors to control motor direction
* robot moves in the direction of a light
*/
int leftPins[] = {5,7,4}; // on pin for PWM, two pins for motor direction
int rightPins[] = {6,3,2};
void setup()
{
for(int i=1; i < 3; i++)
{
pinMode(leftPins[i], OUTPUT);
pinMode(rightPins[i], OUTPUT);
}
}
void loop()
{
int leftVal = analogRead(leftSensorPin);
8.11 Using Sensors to Control the Direction and Speed of Brushed Motors (L293 H-Bridge) | 283
int rightVal = analogRead(rightSensorPin);
if(sensorThreshold == 0) // have the sensors been calibrated ?
sensorThreshold = (leftVal + rightVal) / 2; // no, calibrate sensors
void lookAround()
{
// rotate left for half a second
setSpeed(leftPins, -127 );
setSpeed(rightPins, 127 );
delay(500);
setSpeed(rightPins, 0 );
setSpeed(leftPins, 127 );
}
Discussion
7KLVVNHWFKFRQWUROVWKHVSHHGRIWZRPRWRUVLQUHVSRQVHWRWKHDPRXQWRIOLJKWGHWHFWHG
E\WZRSKRWRFHOOV7KHSKRWRFHOOVDUHDUUDQJHGVRWKDWDQLQFUHDVHLQOLJKWRQRQHVLGH
ZLOOLQFUHDVHWKHVSHHGRIWKHPRWRURQWKHRWKHUVLGH7KLVFDXVHVWKHURERWWRWXUQ
WRZDUGWKHVLGHZLWKWKHEULJKWHUOLJKW/LJKWVKLQLQJHTXDOO\RQERWKFHOOVPDNHVWKH
)LJXUH+%ULGJHZLULQJIRUWKH3ROROXEUHDNRXWERDUG
<RXFDQUHGXFHWKHQXPEHURISLQVQHHGHGE\DGGLQJDGGLWLRQDOKDUGZDUHWRFRQWURO
WKHGLUHFWLRQSLQV7KLVLVGRQHE\XVLQJRQO\RQHSLQSHUPRWRUIRUGLUHFWLRQZLWKD
WUDQVLVWRURUORJLFJDWHWRLQYHUWWKHOHYHORQWKHRWKHU+%ULGJHLQSXW<RXFDQILQG
FLUFXLWGLDJUDPVIRUWKLVLQWKH$UGXLQRZLNLEXWLI\RXZDQWVRPHWKLQJDOUHDG\ZLUHG
XS\RXFDQXVHDQ+%ULGJHVKLHOGVXFKDVWKH)UHHGXLQR0RWRUFRQWUROVKLHOG1.&
8.11 Using Sensors to Control the Direction and Speed of Brushed Motors (L293 H-Bridge) | 285
(OHFWURQLFV$5'RUWKH$UGXPRWRIURP6SDUN)XQ'(97KHVHVKLHOGV
SOXJGLUHFWO\LQWR$UGXLQRDQGRQO\UHTXLUHFRQQHFWLRQVWRWKHPRWRUSRZHUVXSSO\
DQGZLQGLQJV
+HUHLVWKHVNHWFKUHYLVHGIRUWKH$UGXPRWRVKLHOG
/*
* Brushed_H_Ardumoto sketch
* uses photo sensors to control motor direction
* robot moves in the direction of a light
*/
int leftPins[] = {10,12}; // one pin for PWM, one pin for motor direction
int rightPins[] = {11,13};
void setup()
{
pinMode(leftPins[1], OUTPUT);
pinMode(rightPins[1], OUTPUT);
Serial.begin(9600);
}
7KHloopDQGlookAroundIXQFWLRQVDUHLGHQWLFDOWRWKHSUHFHGLQJVNHWFKsetSpeedKDV
OHVVFRGHEHFDXVHKDUGZDUHRQWKHVKLHOGDOORZVDVLQJOHSLQWRFRQWUROPRWRUGLUHFWLRQ
void setSpeed(int pins[], int speed )
{
if(speed < 0)
{
digitalWrite(pins[1],HIGH);
speed = -speed;
}
else
{
digitalWrite(pins[1],LOW);
}
analogWrite(pins[0], speed);
}
7KHSLQDVVLJQPHQWVIRUWKH)UHHGXLQRVKLHOGDUHDVIROORZV
int leftPins[] = {10,13}; // PWM, Direction
int rightPins[] = {9,12}; // PWM, Direction
,I\RXKDYHDGLIIHUHQWVKLHOG\RXZLOOQHHGWRVHHWKHGDWDVKHHWDQGPDNHVXUHWKH
YDOXHVLQWKHVNHWFKPDWFKWKHSLQVXVHGIRU3:0DQGGLUHFWLRQ
Solution
7KLVVNHWFKVWHSVWKHPRWRULQUHVSRQVHWRVHULDOFRPPDQGV$QXPHULFYDOXHIROORZHG
E\DVWHSVLQRQHGLUHFWLRQDVWHSVLQWKHRWKHU)RUH[DPSOHVWHSVDVWHS
PRWRUWKURXJKRQHFRPSOHWHUHYROXWLRQLQRQHGLUHFWLRQDQGVWHSVKDOIDUHYROXWLRQ
LQWKHRWKHUGLUHFWLRQ)LJXUHVKRZVWKHFRQQHFWLRQVWRDIRXUZLUHELSRODUVWHSSHU
XVLQJWKH/+%ULGJH
/*
* Stepper_bipolar sketch
*
* stepper is controlled from the serial port.
* a numeric value followed by '+' or '-' steps the motor
*
*
* http://www.arduino.cc/en/Reference/Stepper
*/
#include <Stepper.h>
int steps = 0;
void setup()
{
// set the speed of the motor to 30 RPMs
void loop()
{
if ( Serial.available()) {
char ch = Serial.read();
)LJXUH)RXUZLUHELSRODUVWHSSHUXVLQJ/+%ULGJH
Discussion
,I\RXUVWHSSHUUHTXLUHVDKLJKHUFXUUHQWWKDQWKH/FDQSURYLGHP$IRUWKH
/'\RXFDQXVHWKH61FKLSWKDWKDQGOHVXSWRDPS)RUFXUUHQWXSWR
DPSV\RXFDQXVHWKH/FKLS7KH/FDQXVHWKHVDPHVNHWFKDVVKRZQLQWKLV
UHFLSHV6ROXWLRQDQGLWVKRXOGEHFRQQHFWHGDVVKRZQLQ)LJXUH
$VLPSOHZD\WRFRQQHFWDQ/WR$UGXLQRLVWRXVHWKH6SDUN)XQ$UGXPRWRVKLHOG
'(97KLVSOXJVRQWRSRIDQ$UGXLQRERDUGDQGRQO\UHTXLUHVH[WHUQDOFRQ
QHFWLRQWRWKHPRWRUZLQGLQJVWKHPRWRUSRZHUFRPHVIURPWKH$UGXLQR9LQH[WHUQDO
9ROWDJH,QSXWSLQ,QLVFRQWUROOHGE\SLQDQG(1$LVSLQ,QLVFRQQHFWHG
WRSLQDQG(1%LVRQSLQ0DNHWKHIROORZLQJFKDQJHVWRWKHFRGHWRXVHWKH
SUHFHGLQJVNHWFKZLWK$UGXPRWR
Stepper stepper(STEPS, 12,13);
int steps = 0;
,Qsetup
pinMode(10, OUTPUT);
digitalWrite(10, LOW); // enable A
// set the speed of the motor to 30 RPMs
stepper.setSpeed(30);
Serial.begin(9600);
pinMode(11, OUTPUT);
digitalWrite(11, LOW); // enable B
7KHloopFRGHLVWKHVDPHDVWKHSUHYLRXVVNHWFK
Solution
7KLV 6ROXWLRQ LV VLPLODU WR 5HFLSH EXW LW XVHV WKH SRSXODU (DV\'ULYHU ERDUG
)LJXUHVKRZVWKHFRQQHFWLRQV
)LJXUH&RQQHFWLQJWKH(DV\'ULYHUERDUG
7KHIROORZLQJVNHWFKFRQWUROVWKHVWHSGLUHFWLRQDQGFRXQWIURPWKHVHULDOSRUW8QOLNH
WKHFRGHLQ5HFLSHLWGRHVQRWUHTXLUHWKHVWHSSHUOLEUDU\EHFDXVHWKH(DV\'ULYHU
ERDUGKDQGOHVWKHFRQWURORIWKHPRWRUFRLOVLQKDUGZDUH
/*
* Stepper_Easystepper sketch
*
* stepper is controlled from the serial port.
* a numeric value followed by '+' or '-' steps the motor
void setup()
{
pinMode(dirPin, OUTPUT);
pinMode(stepPin, OUTPUT);
Serial.begin(9600);
}
void loop()
{
if ( Serial.available()) {
char ch = Serial.read();
8.13 Driving a Bipolar Stepper Motor (Using the EasyDriver Board) | 291
stepsLeft = -steps;
}
// decrement the number of steps, moving one step each time
while(stepsLeft > 0)
{
digitalWrite(stepPin,HIGH);
delayMicroseconds(1);
digitalWrite(stepPin,LOW);
delay(stepDelay);
stepsLeft--; // decrement the steps left
}
}
Discussion
7KH(DV\'ULYHUERDUGLVSRZHUHGWKURXJKWKHSLQVPDUNHG0DQG*QGVKRZQ
LQWKHXSSHUULJKWRI)LJXUH7KHERDUGRSHUDWHVZLWKYROWDJHVEHWZHHQYROWV
Download from Wow! eBook <www.wowebook.com>
DQGYROWVFKHFNWKHVSHFLILFDWLRQVRI\RXUVWHSSHUPRWRUIRUWKHFRUUHFWRSHUDWLQJ
YROWDJH,I\RXDUHXVLQJD9VWHSSHU\RXPXVWSURYLGHYROWVWRWKHSLQVPDUNHG
*QGDQG9WKHVHSLQVDUHRQWKHORZHUOHIWRIWKH(DV\'ULYHUERDUGDQGFXW
WKHMXPSHURQ WKH SULQWHG FLUFXLW ERDUG PDUNHG$3:5WKLVGLVFRQQHFWVWKHRQ
ERDUG UHJXODWRU DQG SRZHUV WKH PRWRU DQG (DV\'ULYHU ERDUG IURP DQ H[WHUQDO 9
VXSSO\
<RXFDQUHGXFHFXUUHQWFRQVXPSWLRQZKHQWKHPRWRULVQRWVWHSSLQJE\FRQQHFWLQJ
WKH(QDEOHSLQWRDVSDUHGLJLWDORXWSXWDQGVHWWLQJWKLV HIGHWRGLVDEOHRXWSXWD LOW
YDOXHHQDEOHVRXWSXW
6WHSSLQJRSWLRQVDUHVHOHFWHGE\FRQQHFWLQJWKH06DQG06SLQVWR9HIGHRU
*QGLOWDVVKRZQLQ7DEOH7KHGHIDXOWRSWLRQVZLWKWKHERDUGFRQQHFWHGDV
VKRZQLQ)LJXUHZLOOXVHHLJKWKVWHSUHVROXWLRQ06DQG06DUHHIGH5HVHWLV
HIGHDQG(QDEOHLVLOW
7DEOH0LFURVWHSRSWLRQV
Resolution MS1 MS2
Full step LOW LOW
Half step HIGH LOW
Quarter step LOW HIGH
Eighth step HIGH HIGH
<RXFDQPRGLI\WKHFRGHVRWKDWWKHVSHHGYDOXHGHWHUPLQHVWKHUHYROXWLRQVSHUVHFRQG
DVIROORZV
// use the following for speed given in RPM
int speed = 100; // desired speed in RPM
int stepsPerRevolution = 200; // this line sets steps for one revolution
(YHU\WKLQJHOVHFDQUHPDLQWKHVDPHEXWQRZWKHVSHHGFRPPDQG\RXVHQGZLOOEH
WKH530RIWKHPRWRUZKHQLWVWHSV
Solution
&RQQHFWDXQLSRODUVWHSSHUDVVKRZQLQ)LJXUH7KH9FRQQHFWLRQJRHVWRDSRZHU
VXSSO\UDWHGIRUWKHYROWDJHDQGFXUUHQWQHHGHGE\\RXUPRWRU
)LJXUH8QLSRODUVWHSSHUFRQQHFWHGXVLQJ8/1GULYHU
#include <Stepper.h>
int steps = 0;
void setup()
{
stepper.setSpeed(30); // set the speed of the motor to 30 RPMs
Serial.begin(9600);
}
void loop()
{
if ( Serial.available()) {
char ch = Serial.read();
Discussion
7KLVW\SHRIPRWRUKDVWZRSDLUVRIFRLOVDQGHDFKFRLOKDVDFRQQHFWLRQWRWKHFHQWHU
0RWRUVZLWKRQO\ILYHZLUHVKDYHERWKFHQWHUFRQQHFWLRQVEURXJKWRXWRQDVLQJOHZLUH
,I WKH FRQQHFWLRQV DUH QRW PDUNHG \RX FDQ LGHQWLI\ WKH ZLULQJ XVLQJ D PXOWLPHWHU
0HDVXUHWKHUHVLVWDQFHDFURVVSDLUVRIZLUHVWRILQGWKHWZRSDLUVRIZLUHVWKDWKDYHWKH
PD[LPXPUHVLVWDQFH7KHFHQWHUWDSZLUHVKRXOGKDYHKDOIWKHUHVLVWDQFHRIWKHIXOOFRLO
$VWHSE\VWHSSURFHGXUHLVDYDLODEOHDWKWWSWHFKUHIPDVVPLQGRUJWHFKUHILRVWHSSHU
ZLUHVDVS