-
Notifications
You must be signed in to change notification settings - Fork 1
/
How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison.html
1981 lines (706 loc) · 246 KB
/
How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<!-- saved from url=(0079)https://automaticaddison.com/how-to-make-an-autonomous-wheeled-robot-using-ros/ -->
<html lang="en-US" class="js"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="profile" href="http://gmpg.org/xfn/11">
<script src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/osd.js.download"></script><script src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/f(4).txt"></script><script src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/f(5).txt" id="google_shimpl"></script><script type="text/javascript" async="" src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/analytics.js.download"></script><script>(function(html){html.className = html.className.replace(/\bno-js\b/,'js')})(document.documentElement);</script>
<title>How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison</title>
<link rel="dns-prefetch" href="https://fonts.googleapis.com/">
<link rel="dns-prefetch" href="https://s.w.org/">
<link href="https://fonts.gstatic.com/" crossorigin="" rel="preconnect">
<link rel="alternate" type="application/rss+xml" title="Automatic Addison » Feed" href="https://automaticaddison.com/feed/">
<link rel="alternate" type="application/rss+xml" title="Automatic Addison » Comments Feed" href="https://automaticaddison.com/comments/feed/">
<script type="text/javascript">
window._wpemojiSettings = {"baseUrl":"https:\/\/s.w.org\/images\/core\/emoji\/12.0.0-1\/72x72\/","ext":".png","svgUrl":"https:\/\/s.w.org\/images\/core\/emoji\/12.0.0-1\/svg\/","svgExt":".svg","source":{"concatemoji":"https:\/\/automaticaddison.com\/wp-includes\/js\/wp-emoji-release.min.js?ver=5.3.2"}};
!function(e,a,t){var r,n,o,i,p=a.createElement("canvas"),s=p.getContext&&p.getContext("2d");function c(e,t){var a=String.fromCharCode;s.clearRect(0,0,p.width,p.height),s.fillText(a.apply(this,e),0,0);var r=p.toDataURL();return s.clearRect(0,0,p.width,p.height),s.fillText(a.apply(this,t),0,0),r===p.toDataURL()}function l(e){if(!s||!s.fillText)return!1;switch(s.textBaseline="top",s.font="600 32px Arial",e){case"flag":return!c([127987,65039,8205,9895,65039],[127987,65039,8203,9895,65039])&&(!c([55356,56826,55356,56819],[55356,56826,8203,55356,56819])&&!c([55356,57332,56128,56423,56128,56418,56128,56421,56128,56430,56128,56423,56128,56447],[55356,57332,8203,56128,56423,8203,56128,56418,8203,56128,56421,8203,56128,56430,8203,56128,56423,8203,56128,56447]));case"emoji":return!c([55357,56424,55356,57342,8205,55358,56605,8205,55357,56424,55356,57340],[55357,56424,55356,57342,8203,55358,56605,8203,55357,56424,55356,57340])}return!1}function d(e){var t=a.createElement("script");t.src=e,t.defer=t.type="text/javascript",a.getElementsByTagName("head")[0].appendChild(t)}for(i=Array("flag","emoji"),t.supports={everything:!0,everythingExceptFlag:!0},o=0;o<i.length;o++)t.supports[i[o]]=l(i[o]),t.supports.everything=t.supports.everything&&t.supports[i[o]],"flag"!==i[o]&&(t.supports.everythingExceptFlag=t.supports.everythingExceptFlag&&t.supports[i[o]]);t.supports.everythingExceptFlag=t.supports.everythingExceptFlag&&!t.supports.flag,t.DOMReady=!1,t.readyCallback=function(){t.DOMReady=!0},t.supports.everything||(n=function(){t.readyCallback()},a.addEventListener?(a.addEventListener("DOMContentLoaded",n,!1),e.addEventListener("load",n,!1)):(e.attachEvent("onload",n),a.attachEvent("onreadystatechange",function(){"complete"===a.readyState&&t.readyCallback()})),(r=t.source||{}).concatemoji?d(r.concatemoji):r.wpemoji&&r.twemoji&&(d(r.twemoji),d(r.wpemoji)))}(window,document,window._wpemojiSettings);
</script><script src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/wp-emoji-release.min.js.download" type="text/javascript" defer=""></script>
<style type="text/css">
img.wp-smiley,
img.emoji {
display: inline !important;
border: none !important;
box-shadow: none !important;
height: 1em !important;
width: 1em !important;
margin: 0 .07em !important;
vertical-align: -0.1em !important;
background: none !important;
padding: 0 !important;
}
</style>
<link rel="stylesheet" id="wp-block-library-css" href="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/style.min.css" type="text/css" media="all">
<link rel="stylesheet" id="wp-block-library-theme-css" href="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/theme.min.css" type="text/css" media="all">
<link rel="stylesheet" id="twentysixteen-fonts-css" href="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/css(1)" type="text/css" media="all">
<link rel="stylesheet" id="genericons-css" href="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/genericons.css" type="text/css" media="all">
<link rel="stylesheet" id="twentysixteen-style-css" href="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/style.css" type="text/css" media="all">
<link rel="stylesheet" id="twentysixteen-block-style-css" href="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/blocks.css" type="text/css" media="all">
<!--[if lt IE 10]>
<link rel='stylesheet' id='twentysixteen-ie-css' href='https://automaticaddison.com/wp-content/themes/twentysixteen/css/ie.css?ver=20160816' type='text/css' media='all' />
<![endif]-->
<!--[if lt IE 9]>
<link rel='stylesheet' id='twentysixteen-ie8-css' href='https://automaticaddison.com/wp-content/themes/twentysixteen/css/ie8.css?ver=20160816' type='text/css' media='all' />
<![endif]-->
<!--[if lt IE 8]>
<link rel='stylesheet' id='twentysixteen-ie7-css' href='https://automaticaddison.com/wp-content/themes/twentysixteen/css/ie7.css?ver=20160816' type='text/css' media='all' />
<![endif]-->
<!--[if lt IE 9]>
<script type='text/javascript' src='https://automaticaddison.com/wp-content/themes/twentysixteen/js/html5.js?ver=3.7.3'></script>
<![endif]-->
<script type="text/javascript" src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/jquery.js.download"></script>
<script type="text/javascript" src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/jquery-migrate.min.js.download"></script>
<link rel="https://api.w.org/" href="https://automaticaddison.com/wp-json/">
<link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://automaticaddison.com/xmlrpc.php?rsd">
<link rel="wlwmanifest" type="application/wlwmanifest+xml" href="https://automaticaddison.com/wp-includes/wlwmanifest.xml">
<link rel="prev" title="What is the Difference Between Mathematical Morphology Filters and Convolution Filters?" href="https://automaticaddison.com/what-is-the-difference-between-mathematical-morphology-filters-and-convolution-filters/">
<link rel="next" title="Real-Time Object Recognition Using a Webcam and Deep Learning" href="https://automaticaddison.com/real-time-object-recognition-using-a-webcam-and-deep-learning/">
<meta name="generator" content="WordPress 5.3.2">
<link rel="canonical" href="https://automaticaddison.com/how-to-make-an-autonomous-wheeled-robot-using-ros/">
<link rel="shortlink" href="https://automaticaddison.com/?p=3458">
<link rel="alternate" type="application/json+oembed" href="https://automaticaddison.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fautomaticaddison.com%2Fhow-to-make-an-autonomous-wheeled-robot-using-ros%2F">
<link rel="alternate" type="text/xml+oembed" href="https://automaticaddison.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fautomaticaddison.com%2Fhow-to-make-an-autonomous-wheeled-robot-using-ros%2F&format=xml">
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async="" src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/js"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-129493515-1');
</script><link rel="icon" href="https://automaticaddison.com/wp-content/uploads/2018/11/cropped-favicon-32x32.png" sizes="32x32">
<link rel="icon" href="https://automaticaddison.com/wp-content/uploads/2018/11/cropped-favicon-192x192.png" sizes="192x192">
<link rel="apple-touch-icon-precomposed" href="https://automaticaddison.com/wp-content/uploads/2018/11/cropped-favicon-180x180.png">
<meta name="msapplication-TileImage" content="https://automaticaddison.com/wp-content/uploads/2018/11/cropped-favicon-270x270.png">
<style type="text/css" id="wp-custom-css">
pre, code{
direction: ltr;
text-align: left;
}
pre {
border: 1px solid #eaecf0;
font-size: 1.1em;
color: #000000;
margin: 10px;
padding: 10px;
background-color: #f8f9fa;}
code {
font-size: 1.1em;
color: #000000;
background-color: #f8f9fa;}
.wp-block-code {
color: #000000;
background-color: #f8f9fa;
border: 1px solid #eaecf0;
padding: 1em;
white-space: pre-wrap;
}
[class^="wp-block-"] figcaption {
text-align: center;
}
img {
border: 2px solid #eeeeee;
padding: 2px;
margin: 3px;
}
/*
.cat-links {
display: none !important;
}
.tags-links {
display: none !important;
}
*/
.custom-logo {
border: none;
} </style>
<link rel="stylesheet" type="text/css" href="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/shCore.css"><link rel="stylesheet" type="text/css" href="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/shThemeDefault.css"><link rel="preload" href="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/f(6).txt" as="script"><script type="text/javascript" src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/f(6).txt"></script><link rel="preload" href="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/f(7).txt" as="script"><script type="text/javascript" src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/f(7).txt"></script></head>
<body class="post-template-default single single-post postid-3458 single-format-standard wp-custom-logo wp-embed-responsive" data-gr-c-s-loaded="true">
<div id="page" class="site" style="height: auto !important;">
<div class="site-inner" style="height: auto !important;">
<a class="skip-link screen-reader-text" href="https://automaticaddison.com/how-to-make-an-autonomous-wheeled-robot-using-ros/#content">Skip to content</a>
<header id="masthead" class="site-header" role="banner">
<div class="site-header-main">
<div class="site-branding">
<a href="https://automaticaddison.com/" class="custom-logo-link" rel="home"><img width="240" height="240" src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/cropped-logo_sq_240.png" class="custom-logo" alt="Automatic Addison" srcset="https://automaticaddison.com/wp-content/uploads/2018/11/cropped-logo_sq_240.png 240w, https://automaticaddison.com/wp-content/uploads/2018/11/cropped-logo_sq_240-150x150.png 150w" sizes="(max-width: 240px) 85vw, 240px"></a>
<p class="site-title"><a href="https://automaticaddison.com/" rel="home">Automatic Addison</a></p>
<p class="site-description">Build the Future</p>
</div><!-- .site-branding -->
<button id="menu-toggle" class="menu-toggle">Menu</button>
<div id="site-header-menu" class="site-header-menu">
<nav id="site-navigation" class="main-navigation" role="navigation" aria-label="Primary Menu">
<div class="menu-main-menu-container"><ul id="menu-main-menu" class="primary-menu"><li id="menu-item-32" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-home menu-item-32"><a href="https://automaticaddison.com/">Home</a></li>
<li id="menu-item-34" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-34"><a href="https://automaticaddison.com/about-me/">About Me</a></li>
</ul></div> </nav><!-- .main-navigation -->
<nav id="social-navigation" class="social-navigation" role="navigation" aria-label="Social Links Menu">
<div class="menu-social-links-container"><ul id="menu-social-links" class="social-links-menu"><li id="menu-item-37" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-37"><a href="https://www.linkedin.com/in/addisonsearscollins/"><span class="screen-reader-text">LinkedIn</span></a></li>
<li id="menu-item-65" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-65"><a href="https://www.youtube.com/channel/UCyR7hy8XDVnqzBhdpRirOtg"><span class="screen-reader-text">YouTube</span></a></li>
</ul></div> </nav><!-- .social-navigation -->
</div><!-- .site-header-menu -->
</div><!-- .site-header-main -->
</header><!-- .site-header -->
<div id="content" class="site-content" style="height: auto !important;">
<div id="primary" class="content-area" style="height: auto !important;">
<main id="main" class="site-main" role="main" style="height: auto !important;">
<article id="post-3458" class="post-3458 post type-post status-publish format-standard has-post-thumbnail hentry category-robotics tag-arduino tag-bluetooth tag-from-scratch tag-python tag-ultrasonic-sensor" style="height: auto !important;">
<header class="entry-header">
<h1 class="entry-title">How to Make an Autonomous Wheeled Robot Using ROS</h1> </header><!-- .entry-header -->
<div class="post-thumbnail">
<img width="1200" height="900" src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/cover-photo-ros-wheeled-robot-1200x900.jpg" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="cover-photo-ros-wheeled-robot" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/cover-photo-ros-wheeled-robot-1200x900.jpg 1200w, https://automaticaddison.com/wp-content/uploads/2019/11/cover-photo-ros-wheeled-robot-300x225.jpg 300w, https://automaticaddison.com/wp-content/uploads/2019/11/cover-photo-ros-wheeled-robot-1024x768.jpg 1024w, https://automaticaddison.com/wp-content/uploads/2019/11/cover-photo-ros-wheeled-robot-768x576.jpg 768w, https://automaticaddison.com/wp-content/uploads/2019/11/cover-photo-ros-wheeled-robot.jpg 1280w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 60vw, (max-width: 1362px) 62vw, 840px"> </div><!-- .post-thumbnail -->
<div class="entry-content" style="height: auto !important;">
<p>In this tutorial, we will build an <strong>autonomous, obstacle-avoiding wheeled robot from scratch using ROS (</strong>Robot Operating System), the popular robotics development platform. I decided to write this tutorial because a lot of introductory books and tutorials on ROS, including the <a href="http://wiki.ros.org/ROS/Tutorials">official ROS tutorials</a>, have you learn ROS by working with <a href="https://automaticaddison.com/how-to-launch-the-turtlebot3-simulation-with-ros/">robots in simulation</a>; but you never learn how to apply what you have learned to an actual physical robot that senses, thinks, and acts in the <strong>real world</strong>. </p>
<p><strong>Our goal is to build the cheapest, most complete robot we could possibly build using ROS. </strong></p><div><script async="" src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/f(8).txt"></script>
<!-- Automatic Addison - Square Ad -->
<ins class="adsbygoogle" style="display: block; height: 280px;" data-ad-client="ca-pub-8920854049012025" data-ad-slot="6511226740" data-ad-format="auto" data-full-width-responsive="true" data-adsbygoogle-status="done"><ins id="aswift_0_expand" style="display:inline-table;border:none;height:280px;margin:0;padding:0;position:relative;visibility:visible;width:600px;background-color:transparent;"><ins id="aswift_0_anchor" style="display:block;border:none;height:280px;margin:0;padding:0;position:relative;visibility:visible;width:600px;background-color:transparent;"><iframe width="600" height="280" frameborder="0" marginwidth="0" marginheight="0" vspace="0" hspace="0" allowtransparency="true" scrolling="no" allowfullscreen="true" onload="var i=this.id,s=window.google_iframe_oncopy,H=s&&s.handlers,h=H&&H[i],w=this.contentWindow,d;try{d=w.document}catch(e){}if(h&&d&&(!d.body||!d.body.firstChild)){if(h.call){setTimeout(h,0)}else if(h.match){try{h=s.upd(h,i)}catch(e){}w.location.replace(h)}}" id="aswift_0" name="aswift_0" style="left: 0px; position: absolute; top: 0px; border: 0px; width: 600px; height: 280px; overflow: visible;" src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/saved_resource.html"></iframe></ins></ins></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script></div>
<div class="wp-block-image"><figure class="aligncenter size-full"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/obstacle_avoiding_robot.gif" alt="obstacle_avoiding_robot" class="wp-image-3461"></figure></div>
<ul><li>We will use low-cost components to build the robot “<strong>body</strong>” (I don’t want to spend hundreds of dollars for a robot kit).</li><li>The “<strong>brain</strong>” of the robot will be Arduino. Arduino is a popular microcontroller (think of it as a small computer) for building electronics projects. </li><li>The robot’s “<strong>nervous system</strong>” — the communication lines that enable the brain to transmit signals and sensory information to and from different parts of its body — will be some inexpensive jumper wires and small electronic components. </li></ul>
<p>All of the parts you need are listed below in the “You Will Need” section. </p>
<p>There are a lot of steps in this tutorial. Have fun, be patient, and be persistent. <strong>Don’t give up!</strong> If something doesn’t work the first time around (as is normally the case in robotics), try again. You will learn a lot more by fighting through to the end of this project.<strong> Stay relentless!</strong></p>
<p><strong>By the end of this tutorial, you will have rock-solid confidence and will know how to use ROS to design and develop a robot that moves around in the real world (not just on your computer screen).</strong></p>
<p>Let’s get started!<br></p>
<p id="top"></p><h1>Table of Contents</h1><p></p>
<ul><li><strong><a href="https://automaticaddison.com/how-to-make-an-autonomous-wheeled-robot-using-ros/#prereq">Prerequisites</a></strong></li>
<li><strong><a href="https://automaticaddison.com/how-to-make-an-autonomous-wheeled-robot-using-ros/#you_will_need">You Will Need</a></strong></li>
<li><strong><a href="https://automaticaddison.com/how-to-make-an-autonomous-wheeled-robot-using-ros/#robot_body">Assemble the “Body” of the Robot</a></strong></li>
<li><strong><a href="https://automaticaddison.com/how-to-make-an-autonomous-wheeled-robot-using-ros/#nervous_system">Assemble the “Nervous System” of the Robot</a></strong></li>
<li><strong><a href="https://automaticaddison.com/how-to-make-an-autonomous-wheeled-robot-using-ros/#ultrasonic">Connect the HC-SR05 Ultrasonic Sensor (the “Eyes”)</a></strong></li>
<li><strong><a href="https://automaticaddison.com/how-to-make-an-autonomous-wheeled-robot-using-ros/#bluetooth">Connect the HC-05 Wireless Bluetooth RF Transceiver (the “Mouth”)</a></strong></li>
<li><strong><a href="https://automaticaddison.com/how-to-make-an-autonomous-wheeled-robot-using-ros/#model">Simulate the 3D Model of the Robot Using URDF</a></strong></li>
<li><strong><a href="https://automaticaddison.com/how-to-make-an-autonomous-wheeled-robot-using-ros/#robot_brain">Program the Arduino (i.e. the “Brain” of the Robot)</a></strong></li>
<li><strong><a href="https://automaticaddison.com/how-to-make-an-autonomous-wheeled-robot-using-ros/#mac_address">Find the MAC Address of Your Bluetooth Module</a></strong></li>
<li><strong><a href="https://automaticaddison.com/how-to-make-an-autonomous-wheeled-robot-using-ros/#ble_ubuntu">Connect the Bluetooth Module to Ubuntu Linux</a></strong></li>
<li><strong><a href="https://automaticaddison.com/how-to-make-an-autonomous-wheeled-robot-using-ros/#ros_package">Create a ROS Package</a></strong></li>
<li><strong><a href="https://automaticaddison.com/how-to-make-an-autonomous-wheeled-robot-using-ros/#ros_publisher">Create a ROS Publisher Node</a></strong></li>
<li><strong><a href="https://automaticaddison.com/how-to-make-an-autonomous-wheeled-robot-using-ros/#ros_subscriber">Create a ROS Subscriber Node</a></strong></li>
<li><strong><a href="https://automaticaddison.com/how-to-make-an-autonomous-wheeled-robot-using-ros/#ros_launch">Create a ROS Launch File</a></strong></li>
<li><strong><a href="https://automaticaddison.com/how-to-make-an-autonomous-wheeled-robot-using-ros/#grand_finale">Grand Finale – Launch Your Autonomous Wheeled Robot</a></strong></li>
</ul>
<h1><a id="prereq"></a>Prerequisites</h1>
<ul><li><a href="https://automaticaddison.com/how-to-install-ros-on-ubuntu-linux-in-5-minutes-or-less/">You have ROS running on Ubuntu Linux</a>. <ul><li>I’m running my Ubuntu Linux inside a virtual machine on Windows 10. If you have MacOS or Linux, that will work just fine. Just make sure you have <a href="http://wiki.ros.org/ROS/Installation">ROS installed</a>.</li></ul></li><li>You have the <a href="https://www.arduino.cc/en/Guide/HomePage">Arduino IDE</a> (Integrated Development Environment) installed on either your PC (Windows, MacOS, or Linux) <a href="https://automaticaddison.com/how-to-connect-arduino-to-ros/">or Within Your Virtual Box</a>.</li><li>If you have experience building a basic wheeled robot using either <a href="https://automaticaddison.com/how-to-make-an-autonomous-wheeled-robot-move-arduino/">Arduino</a> or <a href="https://automaticaddison.com/how-to-make-a-wheeled-robot-using-raspberry-pi/">Raspberry Pi</a>, you will find this tutorial easier to follow. If you don’t have that experience, don’t worry. I’ll explain everything as we go.</li><li>Also, if you did the <a href="https://automaticaddison.com/create-a-hello-world-project-in-ros/">Hello World ROS project</a> (to create a basic ROS Publisher and Subscriber node), you will find this tutorial easier to follow. </li></ul>
<p><strong><a href="https://automaticaddison.com/how-to-make-an-autonomous-wheeled-robot-using-ros/#top">Return to Table of Contents</a></strong></p>
<h1><a id="you_will_need"></a>You Will Need</h1>
<p>Here are the components you will need for this project:</p>
<h2>Robot’s Body</h2>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/1-wheeled-robot-parts.jpg" alt="1-wheeled-robot-parts" class="wp-image-3520" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/1-wheeled-robot-parts.jpg 600w, https://automaticaddison.com/wp-content/uploads/2019/11/1-wheeled-robot-parts-300x225.jpg 300w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></figure></div>
<ul><li><a href="https://amzn.to/2JPuPoG">2WD Smart Robot Car Chassis Kit</a> (This is the robot’s “skeleton”.)</li><li><a href="https://amzn.to/2K6PjcI">HC-05 Wireless Bluetooth RF Transceiver</a> (This is the robot’s “mouth”, enabling it to communicate with the world.)</li><li><a href="https://amzn.to/34A1wyF">4 x 1.5V AA Battery Holder with Switch</a> (This is the robot’s “heart”. Without batteries, a robot is “dead.”)</li><li><a href="https://amzn.to/2CMGpxg">AA Batteries</a> (at least 4)</li><li><a href="https://amzn.to/2NMuyFy">9V Battery</a></li><li><a href="https://amzn.to/2NeuZrX">Velcro Fasteners</a></li><li><a href="https://amzn.to/2pj9oWa">Multi-purpose Black Cable Ties</a></li><li><a href="https://amzn.to/2CbUiEL">Scotch Permanent Mounting Tape</a></li><li><a href="https://amzn.to/2X3UFe1">HC-SR05 Ultrasonic Sensor</a> (HC-SR04 works as well, but it is slightly less accurate. These are the robot’s “eyes”.)</li></ul>
<h2>Robot’s Brain</h2>
<figure class="wp-block-image size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/arduino-uno.jpg" alt="arduino-uno" class="wp-image-3488" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/arduino-uno.jpg 600w, https://automaticaddison.com/wp-content/uploads/2019/11/arduino-uno-300x218.jpg 300w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></figure>
<ul><li><a href="https://amzn.to/34twng5">Arduino Uno</a> (Elegoo Uno works just fine and is cheaper than the regular Arduino)</li></ul>
<h2>Robot’s Nervous System</h2>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/jumper-wires.jpg" alt="jumper-wires" class="wp-image-3526" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/jumper-wires.jpg 600w, https://automaticaddison.com/wp-content/uploads/2019/11/jumper-wires-300x225.jpg 300w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></figure></div>
<ul><li><a href="https://amzn.to/2CbUiEL">400-point Solderless Breadboard</a> (This is the robot’s “spinal cord”…the link between the brain and the nerves in the rest of the body.)</li><li><a href="https://amzn.to/2NgyHkL">Male-to-Male Jumper Wires</a> (These are the robot’s “nerves” that transmit sensory information and signals to make the robot do stuff like move its motors).</li><li><a href="https://amzn.to/2r9fyIY">Assorted Length Jumper Wire Kit</a></li><li><a href="https://amzn.to/2Kzax3e">1K Ohm Resistor</a></li><li><a href="https://amzn.to/2OsjRag">2K Ohm Resistor</a></li><li><a href="https://amzn.to/2EoRsO4">Dual H-Bridge Motor Driver (L293D) for DC or Steppers</a> (I bought Adafruit Part 807)<ul><li>This piece controls the motors of the robot.</li><li>Contains two H-bridges. An H-bridge is a circuit that enables a motor to go both forwards AND backwards.</li></ul></li></ul>
<h2>Soldering Equipment</h2>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/soldering_iron.jpg" alt="soldering_iron" class="wp-image-3523" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/soldering_iron.jpg 600w, https://automaticaddison.com/wp-content/uploads/2019/11/soldering_iron-300x200.jpg 300w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></figure></div>
<p>Soldering is a fundamental skill in robotics. It is the process of joining two metal wires or surfaces together using heat, with the use of metal called “solder”. </p>
<ul><li><a href="https://amzn.to/2X4QxcO">Heat Insulation Silicone Repair Mat</a></li><li><a href="https://amzn.to/2DaIBir">40-Watt Soldering Station</a></li><li><a href="https://amzn.to/2Ir30Dx">63-37 Tin Lead Rosin core solder wire</a></li><li><a href="https://amzn.to/2DbISSg">Damp Sponge</a></li><li><a href="https://amzn.to/2DcMFih">USB Mini Desktop Office Fan</a></li></ul>
<h2>External Bluetooth Transmitter and Receiver for Your PC</h2>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/20-bluetooth-module-rotated.jpg" alt="20-bluetooth-module" class="wp-image-3524" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/20-bluetooth-module-rotated.jpg 450w, https://automaticaddison.com/wp-content/uploads/2019/11/20-bluetooth-module-225x300.jpg 225w" sizes="(max-width: 450px) 85vw, 450px"></figure></div>
<ul><li><a href="https://amzn.to/2Qs1THE">USB Bluetooth Dongle</a> (I’m using Insignia – Bluetooth 4.0 USB Adapter – Black)</li></ul>
<p>That’s it! Once you have purchased all the parts above, continue to the next section to build the robot’s body.</p>
<p><strong><a href="https://automaticaddison.com/how-to-make-an-autonomous-wheeled-robot-using-ros/#top">Return to Table of Contents</a></strong></p>
<h1><a id="robot_body"></a>Assemble the “Body” of the Robot</h1>
<p>Let’s build the body of our robot, step-by-step. </p>
<p>First, open up your robot car chassis kit. You won’t be needing the little switch or the 4 x 1.5V AA battery pack that comes with the robot car chassis, so you can set that aside.</p>
<p>Follow this video below to assemble the robot’s frame: </p>
<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="How to assemble the 2WD Smart Robot Car Chassis Kit for Arduino" width="840" height="473" src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/H78t6dnSoG0.html" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>
</div></figure>
<p>Below are some photos of the assembly of the frame of my robot:</p>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/2-secure-both-motors-to-the-robot-body-using-screws.jpg" alt="2-secure-both-motors-to-the-robot-body-using-screws" class="wp-image-3530" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/2-secure-both-motors-to-the-robot-body-using-screws.jpg 600w, https://automaticaddison.com/wp-content/uploads/2019/11/2-secure-both-motors-to-the-robot-body-using-screws-300x225.jpg 300w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></figure></div>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/3-secure-both-motors.jpg" alt="3-secure-both-motors" class="wp-image-3531" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/3-secure-both-motors.jpg 600w, https://automaticaddison.com/wp-content/uploads/2019/11/3-secure-both-motors-300x225.jpg 300w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></figure></div>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/4-add-the-wheels.jpg" alt="4-add-the-wheels" class="wp-image-3533" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/4-add-the-wheels.jpg 600w, https://automaticaddison.com/wp-content/uploads/2019/11/4-add-the-wheels-300x225.jpg 300w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></figure></div>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/5-add-the-wheels.jpg" alt="5-add-the-wheels" class="wp-image-3534" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/5-add-the-wheels.jpg 600w, https://automaticaddison.com/wp-content/uploads/2019/11/5-add-the-wheels-300x225.jpg 300w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></figure></div>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/6-add-round-plastic-disc.jpg" alt="6-add-round-plastic-disc" class="wp-image-3535" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/6-add-round-plastic-disc.jpg 600w, https://automaticaddison.com/wp-content/uploads/2019/11/6-add-round-plastic-disc-300x225.jpg 300w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></figure></div>
<p>Once you have assembled the robot’s frame, mount the 4 x 1.5V AA battery holder with switch (the one that you purchased) to the rear of the robot. The rear of the robot is the end with the single roller wheel. We will secure it with a few layers of Scotch permanent mounting tape.</p>
<figure class="wp-block-image size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/7-add-battery-pack.jpg" alt="7-add-battery-pack" class="wp-image-3536" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/7-add-battery-pack.jpg 600w, https://automaticaddison.com/wp-content/uploads/2019/11/7-add-battery-pack-300x225.jpg 300w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></figure>
<p>Since the leads of the 4×1.5V AA battery pack are kind of short, you can extend the length of them by wrapping each lead with a male-to-male jumper wire. If you know how to solder wires together (just YouTube “How to Solder Wires Together” for some great video tutorials), you can solder these jumper wires to your battery pack leads.</p>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/8a-battery-pack-on-off-switch.jpg" alt="8a-battery-pack-on-off-switch" class="wp-image-3537" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/8a-battery-pack-on-off-switch.jpg 600w, https://automaticaddison.com/wp-content/uploads/2019/11/8a-battery-pack-on-off-switch-300x225.jpg 300w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"><figcaption>On-Off Switch of the 4×1.5V AA Battery Pack</figcaption></figure></div>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/8-add-battery-pack.jpg" alt="8-add-battery-pack" class="wp-image-3539" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/8-add-battery-pack.jpg 600w, https://automaticaddison.com/wp-content/uploads/2019/11/8-add-battery-pack-300x225.jpg 300w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"><figcaption>See how I have extended the lead wires on my battery pack by using male-to-male jumper wires</figcaption></figure></div>
<p>Mount the Arduino (mine is inside a <a href="https://amzn.to/33WHRcm">protective case</a>) to the top of the battery pack using Scotch permanent mounting tape or Velcro fasteners.</p>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/10-mount-the-arduino.jpg" alt="10-mount-the-arduino" class="wp-image-3541" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/10-mount-the-arduino.jpg 600w, https://automaticaddison.com/wp-content/uploads/2019/11/10-mount-the-arduino-300x225.jpg 300w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></figure></div>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/11-mount-the-arduino.jpg" alt="11-mount-the-arduino" class="wp-image-3542" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/11-mount-the-arduino.jpg 600w, https://automaticaddison.com/wp-content/uploads/2019/11/11-mount-the-arduino-300x225.jpg 300w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></figure></div>
<p>Mount the 400-point solderless breadboard to the front of the robot. The back of the solderless breadboard has peel-off tape, but I prefer to use Velcro fasteners so that I can remove the solderless breadboard whenever I want to.</p>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/9-add-solderless-breadboard.jpg" alt="9-add-solderless-breadboard" class="wp-image-3540" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/9-add-solderless-breadboard.jpg 600w, https://automaticaddison.com/wp-content/uploads/2019/11/9-add-solderless-breadboard-300x225.jpg 300w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></figure></div>
<p>The next thing to do is to connect two male-to-male jumper wires to one of the motors. One jumper wire will thread through the metallic hole on one side of the motor, and the other jumper wire will thread through the hole on the other end of that same motor.</p>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/12-wiring-the-motors.jpg" alt="12-wiring-the-motors" class="wp-image-3544" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/12-wiring-the-motors.jpg 600w, https://automaticaddison.com/wp-content/uploads/2019/11/12-wiring-the-motors-300x225.jpg 300w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></figure></div>
<p>Now wire up the other motor the same way. Connect a male-to-male jumper wire to one of the metallic holes on that motor. Thread another wire through the metallic hole on the other side. </p>
<p>To make sure the jumper wires stick to the metal leads, I recommend you solder them to the leads. Soldering means joining the wire with the metal surface of the motor using hot metal.</p>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/13-soldering-the-motors.jpg" alt="13-soldering-the-motors" class="wp-image-3545" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/13-soldering-the-motors.jpg 600w, https://automaticaddison.com/wp-content/uploads/2019/11/13-soldering-the-motors-300x225.jpg 300w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></figure></div>
<p>Soldering sounds complicated if you have never done it before. It might even seem scary working with hot metal. Don’t worry. I felt the same way before I did my first soldering job. Once you have done one though, you will realize that it is a quick process (lasts no more than a few seconds).</p>
<p>If you have never soldered before, you can check out this video tutorial:<br></p>
<figure class="wp-block-embed-youtube aligncenter wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="Makerfire Robot Car Chassis Kit 02 soldering" width="840" height="473" src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/5sWXx3OHlbs.html" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>
</div></figure>
<p>You can also check out my video below where I solder some metal pins to an electronic board. All the soldering equipment used in this video below is listed in the “You Will Need” section earlier in this tutorial: <br></p>
<figure class="wp-block-embed-youtube aligncenter wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="Setting up the BNO055 Absolute Orientation Sensor | Automatic Addison" width="840" height="473" src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/gJOkzVyrW6w.html" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>
</div></figure>
<p><strong><a href="https://automaticaddison.com/how-to-make-an-autonomous-wheeled-robot-using-ros/#top">Return to Table of Contents</a></strong></p>
<h1><a id="nervous_system"></a>Assemble the “Nervous System” of the Robot</h1>
<p>Now that the robot has its brain (Arduino mounted on the back of the robot) and a body, it needs a “nervous system,” communication lines that enable the brain to transmit signals to and from different parts of its body. In the context of this project, those communication lines are the wires that we need to connect between the different parts of the robot we’re building.</p>
<h2>Connect the L293D to the Solderless Breadboard</h2>
<p>First, we need to connect the L293D motor controller. The job of this component is to control both of your motors. You can think of an L293D motor controller as “air traffic control” for moving electrons. </p>
<p>In order for a motor to move (or for a light bulb to light…heck any object which needs moving electrons (i.e. electricity) to operate), it needs electrons to flow through it. If we move electrons through a motor in one direction, a motor will spin in one direction. If we reverse the direction electrons travel through a motor, we can make a motor spin the other direction. How can we make electrons change directions? That is the function of the L293D motor controller. </p>
<p>By sending electrons to different combinations of pins of the L293D motor controller, we can make the robot car’s motors go forwards and reverse. You don’t need to know the details of how all this works, but just on a high level know that an L293D motor controller accepts electric signals (i.e. moving electrons) from your Arduino board as well as your batteries (think of batteries and your Arduino as “electron pumps”) and gets them to your motors in a way that causes them to spin either clockwise or counter-clockwise to make the wheels turn.</p>
<p>If you want to deep dive into how H-bridges like the L293D motor controller work, check out <a href="https://en.wikipedia.org/wiki/H_bridge">this article on Wikipedia</a>.</p>
<p>If you want to understand how electricity (moving electrons) works. Check out this video, which covers the basics.<br></p>
<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="What is Electric Charge and How Electricity Works | Electronics Basics #1" width="840" height="473" src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/iqVtGNQAC2E.html" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>
</div></figure>
<p>Ok, with that little bit of theory out of the way, let’s start building again.</p>
<p>Sink the 16 pins of the L293D motor controller down into the holes of the solderless breadboard so that the controller straddles the gap that runs the length of the breadboard. If this is the first time you have used a solderless breadboard, check out a quick tutorial on how to read a solderless breadboard. There are a lot of good tutorials on YouTube. Here is one I like:</p>
<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="How to Use a Breadboard" width="840" height="473" src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/6WReFkfrUIk.html" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>
</div></figure>
<p>Here is the diagram of the L293D.</p>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/L293D-with-motors-1.jpg" alt="L293D-with-motors-1" class="wp-image-1405" srcset="https://automaticaddison.com/wp-content/uploads/2019/05/L293D-with-motors-1.jpg 600w, https://automaticaddison.com/wp-content/uploads/2019/05/L293D-with-motors-1-300x141.jpg 300w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></figure></div>
<p>Put pin 1 (the pin just to the left of the half-circle notch in the L293D) into pin e3 of the solderless breadboard. You’ll have to bend the legs a bit on the L293D to get it to sink down all the way. </p>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/14-add-the-L293D.jpg" alt="14-add-the-L293D" class="wp-image-3547" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/14-add-the-L293D.jpg 600w, https://automaticaddison.com/wp-content/uploads/2019/11/14-add-the-L293D-300x225.jpg 300w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></figure></div>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/16a-l293d_bb.jpg" alt="16a-l293d_bb" class="wp-image-3551" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/16a-l293d_bb.jpg 564w, https://automaticaddison.com/wp-content/uploads/2019/11/16a-l293d_bb-179x300.jpg 179w" sizes="(max-width: 564px) 85vw, 564px"></figure></div>
<p>With the L293D settled down firmly into your solderless breadboard, let’s hook everything up. We are going to go from top to bottom on one side of the L293D, and then we will go from top to bottom on the other side of the L293D. We will connect all 16 legs of the L293D, one step at a time, starting from Pin 1. </p>
<p>There are a lot of connections, and you need to get all of them correct in order to get the motors going, so proceed<strong> slowly and carefully </strong>to make sure you get everything right. <strong>No need to hurry</strong>.</p>
<p>Here is the Arduino with its numbered pins.</p>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/arduino-uno.jpg" alt="arduino-uno" class="wp-image-3488" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/arduino-uno.jpg 600w, https://automaticaddison.com/wp-content/uploads/2019/11/arduino-uno-300x218.jpg 300w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></figure></div>
<p>Here is L293D.</p>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/L293D-with-motors-1.jpg" alt="L293D-with-motors-1" class="wp-image-1405" srcset="https://automaticaddison.com/wp-content/uploads/2019/05/L293D-with-motors-1.jpg 600w, https://automaticaddison.com/wp-content/uploads/2019/05/L293D-with-motors-1-300x141.jpg 300w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></figure></div>
<p>And here is the diagram of all the connections we are about to make (sorry the image is so small…just follow the connections I’ve written below): </p>
<figure class="wp-block-image size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/16b-connect_l293d.jpg" alt="16b-connect_l293d" class="wp-image-3552" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/16b-connect_l293d.jpg 600w, https://automaticaddison.com/wp-content/uploads/2019/11/16b-connect_l293d-300x239.jpg 300w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></figure>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/zoom-in-connections.jpg" alt="zoom-in-connections" class="wp-image-3675" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/zoom-in-connections.jpg 507w, https://automaticaddison.com/wp-content/uploads/2019/11/zoom-in-connections-300x243.jpg 300w" sizes="(max-width: 507px) 85vw, 507px"></figure></div>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/arduino_zoom-in.jpg" alt="arduino_zoom-in" class="wp-image-3676"></figure></div>
<h2>Connect Side 1 (Left Motor) of the L293D</h2>
<ul><li><strong>Connect Pin 1 of the L293D to Pin 5 of the Arduino. </strong><ul><li>Pin 1 is the Enable pin of the L293D. It is like a switch that turns the motor ON. </li><li>Pin 1 doesn’t make the motor move directly…it just turns the motor on that side to ON so that it is <strong>able</strong> to move when it receives signals from pins 3 and 6.)</li></ul></li><li><strong>Connect Pin 2 of the L293D to Pin 6 of the Arduino.</strong><ul><li>Pin 6 on the L293D receives an input signal from the Arduino board, either HIGH (5 volts) or LOW (0 volts) voltage.</li></ul></li><li><strong>Connect Pin 3 of the L293D to one of the leads of Motor A</strong> (doesn’t matter which motor, just keep track which one is A and which one is B)<ul><li>Pin 3 of the L293D outputs a signal to Motor A to make it move.</li></ul></li><li><strong>Connect Pin 4 of the L293D to the blue Ground power rail of your solderless breadboard (the one labeled with a negative (-) sign).</strong><ul><li>Pin 4 is connected to <a href="https://en.wikipedia.org/wiki/Ground_(electricity)">electric ground</a> (to make sure that the electric charge in the L293D has somewhere to go and dissipate).</li></ul></li><li><strong>Connect Pin 5 of the L293D to the blue Ground power rail of your solderless breadboard (the one labeled with a negative (-) sign).</strong><ul><li>Pin 5 is connected to <a href="https://en.wikipedia.org/wiki/Ground_(electricity)">electric ground</a> (to make sure that the electric charge in the L293D has somewhere to go and dissipate).</li></ul></li><li><strong>Connect Pin 6 of the L293D to one of the leads of Motor A.</strong><ul><li>Pin 6 of the L293D outputs a signal to Motor A to make it move.</li></ul></li><li><strong>Connect Pin 7 of the L293D to Pin 7 of the Arduino.</strong><ul><li>Pin 7 receives an input signal from the Arduino board, either HIGH (5 volts) or LOW (0 volts) voltage.</li></ul></li><li><strong>Connect Pin 8 of the L293D to the red Positive power rail of your solderless breadboard (the one labeled with a positive (+) sign).</strong><ul><li>This pin requires at least a 5V input power supply (which will come from your batteries…more on this later) to power the motors.</li></ul></li></ul>
<h2>Connect Side 2 (Right Motor) of the L293D</h2>
<ul><li><strong>Connect Pin 16 of the L293D to the positive (red) power rail of the breadboard. Then connect the positive (red) power rail to the 5V pin of the Arduino.</strong><ul><li>This pin is the 5V power supply for the L293D itself. It is not the power supply used to power your motors.</li></ul></li><li><strong>Connect Pin 15 of the L293D to Pin 10 of the Arduino.</strong></li><li><strong>Connect Pin 14 of the L293D to one of the leads of Motor B</strong></li><li><strong>Connect Pin 13 of the L293D to the blue Ground power rail of your solderless breadboard (the one labeled with a negative (-) sign).</strong></li><li><strong>Connect Pin 12 of the L293D to the blue Ground power rail of your solderless breadboard (the one labeled with a negative (-) sign).</strong></li><li><strong>Connect Pin 11 of the L293D to one of the leads of Motor B.</strong></li><li><strong>Connect Pin 10 of the L293D to Pin 9 of the Arduino.</strong></li><li><strong>Connect Pin 9 of the L293D to Pin 8 of the Arduino.</strong></li></ul>
<h2>Connect the Power Rails</h2>
<p>Now we need to connect the power rails of your breadboard.</p>
<ul><li>Get a jumper wire and <strong>connect both blue Ground negative (-) rails together.</strong></li><li><strong>Connect the black (negative) lead of the 4×1.5V AA battery pack to the blue Ground rail</strong> (note there are two AA batteries in the image…you will need 4).</li><li><strong>Connect the red (positive) lead of the battery pack to the red positive power rail of the solderless breadboard.</strong></li><li><strong>Connect the blue Ground (negative) rail to the GND pin on the Arduino.</strong></li><li><strong>Connect the 5V pin of the Arduino to the red (positive) rail of the solderless breadboard.</strong></li></ul>
<figure class="wp-block-image size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/15-wire-the-L293D.jpg" alt="15-wire-the-L293D" class="wp-image-3549" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/15-wire-the-L293D.jpg 600w, https://automaticaddison.com/wp-content/uploads/2019/11/15-wire-the-L293D-300x225.jpg 300w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></figure>
<p>Here is what the final connection should look like:</p>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/16c-final_connection_l293d.jpg" alt="16c-final_connection_l293d" class="wp-image-3491" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/16c-final_connection_l293d.jpg 600w, https://automaticaddison.com/wp-content/uploads/2019/11/16c-final_connection_l293d-300x209.jpg 300w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></figure></div>
<h2>Test Your Connections</h2>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/16-wire-the-L293D.jpg" alt="16-wire-the-L293D" class="wp-image-3555" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/16-wire-the-L293D.jpg 600w, https://automaticaddison.com/wp-content/uploads/2019/11/16-wire-the-L293D-300x225.jpg 300w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></figure></div>
<p>Now let’s test our connections.</p>
<p>Plug in your Arduino to the USB port on your PC.</p>
<p>Open up the Arduino IDE.</p>
<p>We are going to write a program that makes the wheels of your robot go forward, backwards, and then stop. Open a new sketch, and type the following code:</p>
<div><div id="highlighter_393567" class="syntaxhighlighter cpp"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div><div class="line number2 index1 alt1">2</div><div class="line number3 index2 alt2">3</div><div class="line number4 index3 alt1">4</div><div class="line number5 index4 alt2">5</div><div class="line number6 index5 alt1">6</div><div class="line number7 index6 alt2">7</div><div class="line number8 index7 alt1">8</div><div class="line number9 index8 alt2">9</div><div class="line number10 index9 alt1">10</div><div class="line number11 index10 alt2">11</div><div class="line number12 index11 alt1">12</div><div class="line number13 index12 alt2">13</div><div class="line number14 index13 alt1">14</div><div class="line number15 index14 alt2">15</div><div class="line number16 index15 alt1">16</div><div class="line number17 index16 alt2">17</div><div class="line number18 index17 alt1">18</div><div class="line number19 index18 alt2">19</div><div class="line number20 index19 alt1">20</div><div class="line number21 index20 alt2">21</div><div class="line number22 index21 alt1">22</div><div class="line number23 index22 alt2">23</div><div class="line number24 index23 alt1">24</div><div class="line number25 index24 alt2">25</div><div class="line number26 index25 alt1">26</div><div class="line number27 index26 alt2">27</div><div class="line number28 index27 alt1">28</div><div class="line number29 index28 alt2">29</div><div class="line number30 index29 alt1">30</div><div class="line number31 index30 alt2">31</div><div class="line number32 index31 alt1">32</div><div class="line number33 index32 alt2">33</div><div class="line number34 index33 alt1">34</div><div class="line number35 index34 alt2">35</div><div class="line number36 index35 alt1">36</div><div class="line number37 index36 alt2">37</div><div class="line number38 index37 alt1">38</div><div class="line number39 index38 alt2">39</div><div class="line number40 index39 alt1">40</div><div class="line number41 index40 alt2">41</div><div class="line number42 index41 alt1">42</div><div class="line number43 index42 alt2">43</div><div class="line number44 index43 alt1">44</div><div class="line number45 index44 alt2">45</div><div class="line number46 index45 alt1">46</div><div class="line number47 index46 alt2">47</div><div class="line number48 index47 alt1">48</div><div class="line number49 index48 alt2">49</div><div class="line number50 index49 alt1">50</div><div class="line number51 index50 alt2">51</div><div class="line number52 index51 alt1">52</div><div class="line number53 index52 alt2">53</div><div class="line number54 index53 alt1">54</div><div class="line number55 index54 alt2">55</div><div class="line number56 index55 alt1">56</div><div class="line number57 index56 alt2">57</div><div class="line number58 index57 alt1">58</div><div class="line number59 index58 alt2">59</div><div class="line number60 index59 alt1">60</div><div class="line number61 index60 alt2">61</div><div class="line number62 index61 alt1">62</div><div class="line number63 index62 alt2">63</div><div class="line number64 index63 alt1">64</div><div class="line number65 index64 alt2">65</div><div class="line number66 index65 alt1">66</div><div class="line number67 index66 alt2">67</div><div class="line number68 index67 alt1">68</div><div class="line number69 index68 alt2">69</div><div class="line number70 index69 alt1">70</div><div class="line number71 index70 alt2">71</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="cpp comments">/**</code></div><div class="line number2 index1 alt1"><code class="cpp comments">* Bruno Santos, 2013</code></div><div class="line number3 index2 alt2"><code class="cpp comments">* feiticeir0@whatgeek.com.pt</code></div><div class="line number4 index3 alt1"><code class="cpp comments">* Small code to test DC motors </code></div><div class="line number5 index4 alt2"><code class="cpp comments">* 2x with a L298 Dual H-Bridge Motor Driver</code></div><div class="line number6 index5 alt1"><code class="cpp comments">* Free to share</code></div><div class="line number7 index6 alt2"><code class="cpp comments">**/</code></div><div class="line number8 index7 alt1"> </div><div class="line number9 index8 alt2"><code class="cpp comments">//Testing the DC Motors with</code></div><div class="line number10 index9 alt1"><code class="cpp comments">// L293D</code></div><div class="line number11 index10 alt2"> </div><div class="line number12 index11 alt1"><code class="cpp comments">//Define Pins</code></div><div class="line number13 index12 alt2"><code class="cpp comments">//Motor A</code></div><div class="line number14 index13 alt1"><code class="cpp color1 bold">int</code> <code class="cpp plain">enableA = 5;</code></div><div class="line number15 index14 alt2"><code class="cpp color1 bold">int</code> <code class="cpp plain">MotorA1 = 6;</code></div><div class="line number16 index15 alt1"><code class="cpp color1 bold">int</code> <code class="cpp plain">MotorA2 = 7;</code></div><div class="line number17 index16 alt2"><code class="cpp spaces"> </code> </div><div class="line number18 index17 alt1"><code class="cpp comments">//Motor B</code></div><div class="line number19 index18 alt2"><code class="cpp color1 bold">int</code> <code class="cpp plain">enableB = 8;</code></div><div class="line number20 index19 alt1"><code class="cpp color1 bold">int</code> <code class="cpp plain">MotorB1 = 9;</code></div><div class="line number21 index20 alt2"><code class="cpp color1 bold">int</code> <code class="cpp plain">MotorB2 = 10;</code></div><div class="line number22 index21 alt1"> </div><div class="line number23 index22 alt2"><code class="cpp keyword bold">void</code> <code class="cpp plain">setup() {</code></div><div class="line number24 index23 alt1"><code class="cpp spaces"> </code> </div><div class="line number25 index24 alt2"><code class="cpp spaces"> </code><code class="cpp plain">Serial.begin (9600);</code></div><div class="line number26 index25 alt1"><code class="cpp spaces"> </code><code class="cpp comments">//configure pin modes</code></div><div class="line number27 index26 alt2"><code class="cpp spaces"> </code><code class="cpp plain">pinMode (enableA, OUTPUT);</code></div><div class="line number28 index27 alt1"><code class="cpp spaces"> </code><code class="cpp plain">pinMode (MotorA1, OUTPUT);</code></div><div class="line number29 index28 alt2"><code class="cpp spaces"> </code><code class="cpp plain">pinMode (MotorA2, OUTPUT); </code></div><div class="line number30 index29 alt1"><code class="cpp spaces"> </code> </div><div class="line number31 index30 alt2"><code class="cpp spaces"> </code><code class="cpp plain">pinMode (enableB, OUTPUT);</code></div><div class="line number32 index31 alt1"><code class="cpp spaces"> </code><code class="cpp plain">pinMode (MotorB1, OUTPUT);</code></div><div class="line number33 index32 alt2"><code class="cpp spaces"> </code><code class="cpp plain">pinMode (MotorB2, OUTPUT); </code></div><div class="line number34 index33 alt1"><code class="cpp spaces"> </code> </div><div class="line number35 index34 alt2"><code class="cpp plain">}</code></div><div class="line number36 index35 alt1"> </div><div class="line number37 index36 alt2"><code class="cpp keyword bold">void</code> <code class="cpp plain">loop() {</code></div><div class="line number38 index37 alt1"><code class="cpp spaces"> </code><code class="cpp comments">//enabling motor A and B</code></div><div class="line number39 index38 alt2"><code class="cpp spaces"> </code><code class="cpp plain">Serial.println (</code><code class="cpp string">"Enabling Motors"</code><code class="cpp plain">);</code></div><div class="line number40 index39 alt1"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite (enableA, HIGH);</code></div><div class="line number41 index40 alt2"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite (enableB, HIGH);</code></div><div class="line number42 index41 alt1"><code class="cpp spaces"> </code><code class="cpp plain">delay (3000);</code></div><div class="line number43 index42 alt2"><code class="cpp spaces"> </code><code class="cpp comments">//do something</code></div><div class="line number44 index43 alt1"> </div><div class="line number45 index44 alt2"><code class="cpp spaces"> </code><code class="cpp plain">Serial.println (</code><code class="cpp string">"Motion Forward"</code><code class="cpp plain">);</code></div><div class="line number46 index45 alt1"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite (MotorA1, LOW);</code></div><div class="line number47 index46 alt2"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite (MotorA2, HIGH);</code></div><div class="line number48 index47 alt1"> </div><div class="line number49 index48 alt2"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite (MotorB1, LOW);</code></div><div class="line number50 index49 alt1"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite (MotorB2, HIGH);</code></div><div class="line number51 index50 alt2"> </div><div class="line number52 index51 alt1"><code class="cpp spaces"> </code><code class="cpp comments">//3s forward</code></div><div class="line number53 index52 alt2"><code class="cpp spaces"> </code><code class="cpp plain">delay (3000);</code></div><div class="line number54 index53 alt1"><code class="cpp spaces"> </code> </div><div class="line number55 index54 alt2"><code class="cpp spaces"> </code><code class="cpp plain">Serial.println (</code><code class="cpp string">"Motion Backwards"</code><code class="cpp plain">);</code></div><div class="line number56 index55 alt1"><code class="cpp spaces"> </code><code class="cpp comments">//reverse</code></div><div class="line number57 index56 alt2"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite (MotorA1,HIGH);</code></div><div class="line number58 index57 alt1"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite (MotorA2,LOW); </code></div><div class="line number59 index58 alt2"><code class="cpp spaces"> </code> </div><div class="line number60 index59 alt1"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite (MotorB1,HIGH);</code></div><div class="line number61 index60 alt2"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite (MotorB2,LOW); </code></div><div class="line number62 index61 alt1"> </div><div class="line number63 index62 alt2"><code class="cpp spaces"> </code><code class="cpp comments">//3s backwards</code></div><div class="line number64 index63 alt1"><code class="cpp spaces"> </code><code class="cpp plain">delay (3000);</code></div><div class="line number65 index64 alt2"> </div><div class="line number66 index65 alt1"><code class="cpp spaces"> </code><code class="cpp plain">Serial.println (</code><code class="cpp string">"Stoping motors"</code><code class="cpp plain">);</code></div><div class="line number67 index66 alt2"><code class="cpp spaces"> </code><code class="cpp comments">//stop</code></div><div class="line number68 index67 alt1"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite (enableA, LOW);</code></div><div class="line number69 index68 alt2"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite (enableB, LOW);</code></div><div class="line number70 index69 alt1"><code class="cpp spaces"> </code><code class="cpp plain">delay (3000);</code></div><div class="line number71 index70 alt2"><code class="cpp plain">}</code></div></div></td></tr></tbody></table></div></div>
<p>Before you upload your code to your Arduino, hold your robot in your hand because the wheels are about to move, and you don’t want your robot to rip away from your computer!</p>
<p>You can now upload the code to your Arduino, and turn the 4×1.5V AA battery pack to the ON position.</p>
<p>When you have had enough, upload a blank, new sketch to your Arduino board (this will stop the program).</p>
<p>Right after you upload the code to your board, the first movement your wheels should make is forward. If a wheel is not moving forward on that first segment of the loop, you need to switch the holes that the two leads from that wheel are connected to. In this case, if it is motor A that is not moving like it should, the leads connected to Pin 3 and Pin 6 of the L293D need to switch places.</p>
<p><strong><a href="https://automaticaddison.com/how-to-make-an-autonomous-wheeled-robot-using-ros/#top">Return to Table of Contents</a></strong></p>
<h1><a id="ultrasonic"></a>Connect the HC-SR05 Ultrasonic Sensor (the “Eyes”)</h1>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/17-add-ultrasonic-sensor.jpg" alt="17-add-ultrasonic-sensor" class="wp-image-3556" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/17-add-ultrasonic-sensor.jpg 600w, https://automaticaddison.com/wp-content/uploads/2019/11/17-add-ultrasonic-sensor-300x225.jpg 300w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></figure></div>
<p>Now we need to connect the HC-SR05 ultrasonic sensor to the solderless breadboard in order to be able to <a href="https://automaticaddison.com/how-to-make-an-obstacle-avoiding-robot-arduino/">detect obstacles in the robot’s path</a>. I recommend you sink the ultrasonic sensor down into available holes of your solderless breadboard. You want the ultrasonic sensor to face the front of your robot.</p>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/17a-ultrasonic_sensor_wiring.jpg" alt="17a-ultrasonic_sensor_wiring" class="wp-image-3557" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/17a-ultrasonic_sensor_wiring.jpg 600w, https://automaticaddison.com/wp-content/uploads/2019/11/17a-ultrasonic_sensor_wiring-300x206.jpg 300w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></figure></div>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/usound-colors-2.jpg" alt="usound-colors-2" class="wp-image-3673" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/usound-colors-2.jpg 463w, https://automaticaddison.com/wp-content/uploads/2019/11/usound-colors-2-300x213.jpg 300w" sizes="(max-width: 463px) 85vw, 463px"></figure></div>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/arduino-12-13.jpg" alt="arduino-12-13" class="wp-image-3670" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/arduino-12-13.jpg 113w, https://automaticaddison.com/wp-content/uploads/2019/11/arduino-12-13-109x300.jpg 109w" sizes="(max-width: 113px) 85vw, 113px"></figure></div>
<p>Here are the connections:</p>
<ul><li><strong>VCC on the sensor connects to the positive (red) rail of the solderless breadboard, which is connected to the 5V pin on the Arduino</strong></li><li><strong>Echo on the sensor connects to Digital Pin 13 on the Arduino</strong></li><li><strong>Trig (stands for trigger) on the sensor connects to Digital Pin 12 on the Arduino</strong></li><li><strong>GND (stands for Ground) on the sensor connects to ground on the solderless breadboard (blue negative rail).</strong></li></ul>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/18-add-ultrasonic-sensor.jpg" alt="18-add-ultrasonic-sensor" class="wp-image-3559" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/18-add-ultrasonic-sensor.jpg 600w, https://automaticaddison.com/wp-content/uploads/2019/11/18-add-ultrasonic-sensor-300x225.jpg 300w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></figure></div>
<p>Let’s test the ultrasonic sensor.</p>
<p>Plug in your Arduino to the USB port on your laptop computer.</p>
<p>Open the Arduino IDE.</p>
<p>Upload the following sketch to the Arduino to test the ultrasonic sensor.</p>
<div><div id="highlighter_72268" class="syntaxhighlighter cpp"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div><div class="line number2 index1 alt1">2</div><div class="line number3 index2 alt2">3</div><div class="line number4 index3 alt1">4</div><div class="line number5 index4 alt2">5</div><div class="line number6 index5 alt1">6</div><div class="line number7 index6 alt2">7</div><div class="line number8 index7 alt1">8</div><div class="line number9 index8 alt2">9</div><div class="line number10 index9 alt1">10</div><div class="line number11 index10 alt2">11</div><div class="line number12 index11 alt1">12</div><div class="line number13 index12 alt2">13</div><div class="line number14 index13 alt1">14</div><div class="line number15 index14 alt2">15</div><div class="line number16 index15 alt1">16</div><div class="line number17 index16 alt2">17</div><div class="line number18 index17 alt1">18</div><div class="line number19 index18 alt2">19</div><div class="line number20 index19 alt1">20</div><div class="line number21 index20 alt2">21</div><div class="line number22 index21 alt1">22</div><div class="line number23 index22 alt2">23</div><div class="line number24 index23 alt1">24</div><div class="line number25 index24 alt2">25</div><div class="line number26 index25 alt1">26</div><div class="line number27 index26 alt2">27</div><div class="line number28 index27 alt1">28</div><div class="line number29 index28 alt2">29</div><div class="line number30 index29 alt1">30</div><div class="line number31 index30 alt2">31</div><div class="line number32 index31 alt1">32</div><div class="line number33 index32 alt2">33</div><div class="line number34 index33 alt1">34</div><div class="line number35 index34 alt2">35</div><div class="line number36 index35 alt1">36</div><div class="line number37 index36 alt2">37</div><div class="line number38 index37 alt1">38</div><div class="line number39 index38 alt2">39</div><div class="line number40 index39 alt1">40</div><div class="line number41 index40 alt2">41</div><div class="line number42 index41 alt1">42</div><div class="line number43 index42 alt2">43</div><div class="line number44 index43 alt1">44</div><div class="line number45 index44 alt2">45</div><div class="line number46 index45 alt1">46</div><div class="line number47 index46 alt2">47</div><div class="line number48 index47 alt1">48</div><div class="line number49 index48 alt2">49</div><div class="line number50 index49 alt1">50</div><div class="line number51 index50 alt2">51</div><div class="line number52 index51 alt1">52</div><div class="line number53 index52 alt2">53</div><div class="line number54 index53 alt1">54</div><div class="line number55 index54 alt2">55</div><div class="line number56 index55 alt1">56</div><div class="line number57 index56 alt2">57</div><div class="line number58 index57 alt1">58</div><div class="line number59 index58 alt2">59</div><div class="line number60 index59 alt1">60</div><div class="line number61 index60 alt2">61</div><div class="line number62 index61 alt1">62</div><div class="line number63 index62 alt2">63</div><div class="line number64 index63 alt1">64</div><div class="line number65 index64 alt2">65</div><div class="line number66 index65 alt1">66</div><div class="line number67 index66 alt2">67</div><div class="line number68 index67 alt1">68</div><div class="line number69 index68 alt2">69</div><div class="line number70 index69 alt1">70</div><div class="line number71 index70 alt2">71</div><div class="line number72 index71 alt1">72</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="cpp comments">/**</code></div><div class="line number2 index1 alt1"><code class="cpp spaces"> </code><code class="cpp comments">* This program tests the ultrasonic</code></div><div class="line number3 index2 alt2"><code class="cpp spaces"> </code><code class="cpp comments">* distance sensor</code></div><div class="line number4 index3 alt1"><code class="cpp spaces"> </code><code class="cpp comments">* </code></div><div class="line number5 index4 alt2"><code class="cpp spaces"> </code><code class="cpp comments">* @author Addison Sears-Collins</code></div><div class="line number6 index5 alt1"><code class="cpp spaces"> </code><code class="cpp comments">* @version 1.0 2019-05-13</code></div><div class="line number7 index6 alt2"><code class="cpp spaces"> </code><code class="cpp comments">*/</code></div><div class="line number8 index7 alt1"><code class="cpp spaces"> </code> </div><div class="line number9 index8 alt2"><code class="cpp comments">/* Give a name to a constant value before</code></div><div class="line number10 index9 alt1"><code class="cpp spaces"> </code><code class="cpp comments">* the program is compiled. The compiler will </code></div><div class="line number11 index10 alt2"><code class="cpp spaces"> </code><code class="cpp comments">* replace references to Trigger and Echo with </code></div><div class="line number12 index11 alt1"><code class="cpp spaces"> </code><code class="cpp comments">* 7 and 8, respectively, at compile time.</code></div><div class="line number13 index12 alt2"><code class="cpp spaces"> </code><code class="cpp comments">* These defined constants don't take up </code></div><div class="line number14 index13 alt1"><code class="cpp spaces"> </code><code class="cpp comments">* memory space on the Arduino.</code></div><div class="line number15 index14 alt2"><code class="cpp spaces"> </code><code class="cpp comments">*/</code></div><div class="line number16 index15 alt1"><code class="cpp preprocessor">#define Trigger 12</code></div><div class="line number17 index16 alt2"><code class="cpp preprocessor">#define Echo 13</code></div><div class="line number18 index17 alt1"><code class="cpp spaces"> </code> </div><div class="line number19 index18 alt2"><code class="cpp comments">/* </code></div><div class="line number20 index19 alt1"><code class="cpp spaces"> </code><code class="cpp comments">* This setup code is run only once, when </code></div><div class="line number21 index20 alt2"><code class="cpp spaces"> </code><code class="cpp comments">* Arudino is supplied with power.</code></div><div class="line number22 index21 alt1"><code class="cpp spaces"> </code><code class="cpp comments">*/</code></div><div class="line number23 index22 alt2"><code class="cpp keyword bold">void</code> <code class="cpp plain">setup(){</code></div><div class="line number24 index23 alt1"><code class="cpp spaces"> </code> </div><div class="line number25 index24 alt2"><code class="cpp spaces"> </code><code class="cpp comments">// Set the baud rate to 9600. 9600 means that </code></div><div class="line number26 index25 alt1"><code class="cpp spaces"> </code><code class="cpp comments">// the serial port is capable of transferring </code></div><div class="line number27 index26 alt2"><code class="cpp spaces"> </code><code class="cpp comments">// a maximum of 9600 bits per second.</code></div><div class="line number28 index27 alt1"><code class="cpp spaces"> </code><code class="cpp plain">Serial.begin(9600);</code></div><div class="line number29 index28 alt2"><code class="cpp spaces"> </code> </div><div class="line number30 index29 alt1"><code class="cpp spaces"> </code><code class="cpp comments">// Define each pin as an input or output.</code></div><div class="line number31 index30 alt2"><code class="cpp spaces"> </code><code class="cpp plain">pinMode(Echo, INPUT);</code></div><div class="line number32 index31 alt1"><code class="cpp spaces"> </code><code class="cpp plain">pinMode(Trigger, OUTPUT);</code></div><div class="line number33 index32 alt2"><code class="cpp plain">}</code></div><div class="line number34 index33 alt1"><code class="cpp spaces"> </code> </div><div class="line number35 index34 alt2"><code class="cpp keyword bold">void</code> <code class="cpp plain">loop(){</code></div><div class="line number36 index35 alt1"><code class="cpp spaces"> </code> </div><div class="line number37 index36 alt2"><code class="cpp spaces"> </code><code class="cpp comments">// Make the Trigger LOW (0 volts) </code></div><div class="line number38 index37 alt1"><code class="cpp spaces"> </code><code class="cpp comments">// for 2 microseconds</code></div><div class="line number39 index38 alt2"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite(Trigger, LOW);</code></div><div class="line number40 index39 alt1"><code class="cpp spaces"> </code><code class="cpp plain">delayMicroseconds(2);</code></div><div class="line number41 index40 alt2"><code class="cpp spaces"> </code> </div><div class="line number42 index41 alt1"><code class="cpp spaces"> </code><code class="cpp comments">// Emit high frequency 40kHz sound pulse</code></div><div class="line number43 index42 alt2"><code class="cpp spaces"> </code><code class="cpp comments">// (i.e. pull the Trigger) </code></div><div class="line number44 index43 alt1"><code class="cpp spaces"> </code><code class="cpp comments">// by making Trigger HIGH (5 volts) </code></div><div class="line number45 index44 alt2"><code class="cpp spaces"> </code><code class="cpp comments">// for 10 microseconds</code></div><div class="line number46 index45 alt1"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite(Trigger, HIGH);</code></div><div class="line number47 index46 alt2"><code class="cpp spaces"> </code><code class="cpp plain">delayMicroseconds(10);</code></div><div class="line number48 index47 alt1"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite(Trigger, LOW); </code></div><div class="line number49 index48 alt2"><code class="cpp spaces"> </code> </div><div class="line number50 index49 alt1"><code class="cpp spaces"> </code><code class="cpp comments">// Detect a pulse on the Echo pin 8. </code></div><div class="line number51 index50 alt2"><code class="cpp spaces"> </code><code class="cpp comments">// pulseIn() measures the time in </code></div><div class="line number52 index51 alt1"><code class="cpp spaces"> </code><code class="cpp comments">// microseconds until the sound pulse</code></div><div class="line number53 index52 alt2"><code class="cpp spaces"> </code><code class="cpp comments">// returns back to the sensor.</code></div><div class="line number54 index53 alt1"><code class="cpp spaces"> </code><code class="cpp color1 bold">int</code> <code class="cpp plain">distance = pulseIn(Echo, HIGH);</code></div><div class="line number55 index54 alt2"><code class="cpp spaces"> </code> </div><div class="line number56 index55 alt1"><code class="cpp spaces"> </code><code class="cpp comments">// Speed of sound is:</code></div><div class="line number57 index56 alt2"><code class="cpp spaces"> </code><code class="cpp comments">// 13511.811023622 inches per second</code></div><div class="line number58 index57 alt1"><code class="cpp spaces"> </code><code class="cpp comments">// 13511.811023622/10^6 inches per microsecond</code></div><div class="line number59 index58 alt2"><code class="cpp spaces"> </code><code class="cpp comments">// 0.013511811 inches per microsecond</code></div><div class="line number60 index59 alt1"><code class="cpp spaces"> </code><code class="cpp comments">// Taking the reciprocal, we have:</code></div><div class="line number61 index60 alt2"><code class="cpp spaces"> </code><code class="cpp comments">// 74.00932414 microseconds per inch </code></div><div class="line number62 index61 alt1"><code class="cpp spaces"> </code><code class="cpp comments">// Below, we convert microseconds to inches by </code></div><div class="line number63 index62 alt2"><code class="cpp spaces"> </code><code class="cpp comments">// dividing by 74 and then dividing by 2</code></div><div class="line number64 index63 alt1"><code class="cpp spaces"> </code><code class="cpp comments">// to account for the roundtrip time.</code></div><div class="line number65 index64 alt2"><code class="cpp spaces"> </code><code class="cpp plain">distance = distance / 74 / 2;</code></div><div class="line number66 index65 alt1"><code class="cpp spaces"> </code> </div><div class="line number67 index66 alt2"><code class="cpp spaces"> </code><code class="cpp comments">// Print the distance in inches</code></div><div class="line number68 index67 alt1"><code class="cpp spaces"> </code><code class="cpp plain">Serial.println(distance);</code></div><div class="line number69 index68 alt2"><code class="cpp spaces"> </code> </div><div class="line number70 index69 alt1"><code class="cpp spaces"> </code><code class="cpp comments">// Pause for 100 milliseconds</code></div><div class="line number71 index70 alt2"><code class="cpp spaces"> </code><code class="cpp plain">delay(100);</code></div><div class="line number72 index71 alt1"><code class="cpp plain">}</code></div></div></td></tr></tbody></table></div></div>
<p>As soon as uploading is finished and with the USB cable still connected to the Arduino, click on the green magnifying glass in the upper right of the IDE to open the Serial Monitor.</p>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/24-magnifying-glass-arduino.jpg" alt="24-magnifying-glass-arduino" class="wp-image-3563" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/24-magnifying-glass-arduino.jpg 442w, https://automaticaddison.com/wp-content/uploads/2019/11/24-magnifying-glass-arduino-300x162.jpg 300w" sizes="(max-width: 442px) 85vw, 442px"></figure></div>
<p>Make sure you have the following settings:</p>
<ul><li>Autoscroll: selected</li><li>Line ending: No Line ending</li><li>Baud: 9600 baud</li></ul>
<p>Place any object in front of the sensor and move it back and forth. You should see the distance readings (in inches) on the Serial Monitor change accordingly.</p>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/19-test_ultrasonic_sensorJPG.jpg" alt="19-test_ultrasonic_sensorJPG" class="wp-image-3562" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/19-test_ultrasonic_sensorJPG.jpg 600w, https://automaticaddison.com/wp-content/uploads/2019/11/19-test_ultrasonic_sensorJPG-300x131.jpg 300w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></figure></div>
<p><strong><a href="https://automaticaddison.com/how-to-make-an-autonomous-wheeled-robot-using-ros/#top">Return to Table of Contents</a></strong></p>
<h1><a id="bluetooth"></a>Connect the HC-05 Wireless Bluetooth RF Transceiver (the “Mouth”)</h1>
<p>Now we need to connect the HC-05 Wireless Bluetooth RF Transceiver (i.e. bluetooth module). </p>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/20a-bluetooth-connection-diagram.jpg" alt="20a-bluetooth-connection-diagram" class="wp-image-3565" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/20a-bluetooth-connection-diagram.jpg 600w, https://automaticaddison.com/wp-content/uploads/2019/11/20a-bluetooth-connection-diagram-300x202.jpg 300w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></figure></div>
<figure class="wp-block-image size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/ble-module.jpg" alt="ble-module" class="wp-image-3667" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/ble-module.jpg 615w, https://automaticaddison.com/wp-content/uploads/2019/11/ble-module-264x300.jpg 264w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></figure>
<ul><li><strong>Connect the VCC pin of the bluetooth module to the red (positive) power rail of your solderless breadboard</strong> (the rail connected to the 5V pin of the Arduino). <ul><li>Note that the bluetooth module can accept an input power supply of 3.6 to 6V, so we could have also connected it to the rail connected to the 6V battery pack (i.e. 1.5V * 4 batteries).</li></ul></li><li><strong>Connect GND to the negative (blue) ground power rail of the solderless breadboard.</strong></li><li><strong>Connect the TXD pin (transmitter) of the bluetooth module to digital pin 2 (this will be the receiver RX) on the Arduino.</strong></li><li><strong>Connect the RXD pin (receiver) of the bluetooth module to a 1K ohm resistor. </strong><ul><li>We have to use a resistor because this pin can only handle 3.3V, but the Arduino generates 5V. We don’t want to burn out our bluetooth module!</li></ul></li><li><strong>Connect the 1K ohm resistor to digital pin 3 (this will be the transmitter TX) on the Arduino.</strong></li><li><strong>Connect the RXD pin (receiver) of the bluetooth module to a 2K ohm resistor. </strong><ul><li>This whole 1K ohm + 2K ohm resistor set up is used to divide the 5V input voltage from the Arduino. It is formally called a <a href="https://automaticaddison.com/how-to-make-an-obstacle-avoiding-robot-using-raspberry-pi/">voltage divider</a>.</li></ul></li><li><strong>Connect the 2K ohm resistor to the negative (blue) ground power rail of the solderless breadboard.</strong></li></ul>
<p>There are a lot of wires and components connected. Double check that everything is wired correctly.</p>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/20b-add-bluetooth-module.jpg" alt="20b-add-bluetooth-module" class="wp-image-3567" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/20b-add-bluetooth-module.jpg 600w, https://automaticaddison.com/wp-content/uploads/2019/11/20b-add-bluetooth-module-300x225.jpg 300w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></figure></div>
<p>Once you have the HC-05 connected, let’s test it. First, download a bluetooth terminal app on your smartphone. We want to speak with the Arduino via our smartphone. I will download the <a href="https://play.google.com/store/apps/details?id=de.kai_morich.serial_bluetooth_terminal&hl=en_US" target="_blank" rel="noreferrer noopener" aria-label="Serial Bluetooth Terminal app (opens in a new tab)">Serial Bluetooth Terminal app</a> from the Google Play store.</p>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/23-serial_bluetooth_terminal_app.jpg" alt="23-serial_bluetooth_terminal_app" class="wp-image-3579" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/23-serial_bluetooth_terminal_app.jpg 600w, https://automaticaddison.com/wp-content/uploads/2019/11/23-serial_bluetooth_terminal_app-300x278.jpg 300w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></figure></div>
<p>Next, we write the following code and upload it to our Arduino board.</p>
<div><div id="highlighter_793380" class="syntaxhighlighter cpp"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div><div class="line number2 index1 alt1">2</div><div class="line number3 index2 alt2">3</div><div class="line number4 index3 alt1">4</div><div class="line number5 index4 alt2">5</div><div class="line number6 index5 alt1">6</div><div class="line number7 index6 alt2">7</div><div class="line number8 index7 alt1">8</div><div class="line number9 index8 alt2">9</div><div class="line number10 index9 alt1">10</div><div class="line number11 index10 alt2">11</div><div class="line number12 index11 alt1">12</div><div class="line number13 index12 alt2">13</div><div class="line number14 index13 alt1">14</div><div class="line number15 index14 alt2">15</div><div class="line number16 index15 alt1">16</div><div class="line number17 index16 alt2">17</div><div class="line number18 index17 alt1">18</div><div class="line number19 index18 alt2">19</div><div class="line number20 index19 alt1">20</div><div class="line number21 index20 alt2">21</div><div class="line number22 index21 alt1">22</div><div class="line number23 index22 alt2">23</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="cpp preprocessor">#include <SoftwareSerial.h></code></div><div class="line number2 index1 alt1"><code class="cpp plain">SoftwareSerial EEBlue(2, 3); </code><code class="cpp comments">// RX | TX</code></div><div class="line number3 index2 alt2"><code class="cpp keyword bold">void</code> <code class="cpp plain">setup()</code></div><div class="line number4 index3 alt1"><code class="cpp plain">{</code></div><div class="line number5 index4 alt2"><code class="cpp spaces"> </code> </div><div class="line number6 index5 alt1"><code class="cpp spaces"> </code><code class="cpp plain">Serial.begin(9600);</code></div><div class="line number7 index6 alt2"><code class="cpp spaces"> </code><code class="cpp plain">EEBlue.begin(9600); </code><code class="cpp comments">//Default Baud rate </code></div><div class="line number8 index7 alt1"><code class="cpp spaces"> </code><code class="cpp plain">Serial.println(</code><code class="cpp string">"The Bluetooth gates are open."</code><code class="cpp plain">);</code></div><div class="line number9 index8 alt2"><code class="cpp spaces"> </code><code class="cpp plain">Serial.println(</code><code class="cpp string">"Connect to HC-05 with 1234 as key!"</code><code class="cpp plain">);</code></div><div class="line number10 index9 alt1"><code class="cpp spaces"> </code> </div><div class="line number11 index10 alt2"><code class="cpp plain">}</code></div><div class="line number12 index11 alt1"><code class="cpp spaces"> </code> </div><div class="line number13 index12 alt2"><code class="cpp keyword bold">void</code> <code class="cpp plain">loop()</code></div><div class="line number14 index13 alt1"><code class="cpp plain">{</code></div><div class="line number15 index14 alt2"><code class="cpp spaces"> </code> </div><div class="line number16 index15 alt1"><code class="cpp spaces"> </code><code class="cpp comments">// Feed any data from bluetooth to Terminal.</code></div><div class="line number17 index16 alt2"><code class="cpp spaces"> </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(EEBlue.available())</code></div><div class="line number18 index17 alt1"><code class="cpp spaces"> </code><code class="cpp plain">Serial.write(EEBlue.read());</code></div><div class="line number19 index18 alt2"><code class="cpp spaces"> </code> </div><div class="line number20 index19 alt1"><code class="cpp spaces"> </code><code class="cpp comments">// Feed all data from terminal to bluetooth</code></div><div class="line number21 index20 alt2"><code class="cpp spaces"> </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(Serial.available())</code></div><div class="line number22 index21 alt1"><code class="cpp spaces"> </code><code class="cpp plain">EEBlue.write(Serial.read());</code></div><div class="line number23 index22 alt2"><code class="cpp plain">}</code></div></div></td></tr></tbody></table></div></div>
<p>Click the magnifying glass in the upper right of the IDE to start the program.</p>
<p>Now, on your smartphone, open the Serial Bluetooth Terminal app. </p>
<p>Turn on Bluetooth on your smartphone.</p>
<p>Pair with the HC-05.</p>
<p>Within the Serial Bluetooth Terminal app, go to the menu on the left-hand side and select <strong>Devices</strong>.</p>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/21c-ble-pairing-485x1024.jpg" alt="21c-ble-pairing" class="wp-image-3572" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/21c-ble-pairing-485x1024.jpg 485w, https://automaticaddison.com/wp-content/uploads/2019/11/21c-ble-pairing-142x300.jpg 142w, https://automaticaddison.com/wp-content/uploads/2019/11/21c-ble-pairing.jpg 600w" sizes="(max-width: 485px) 85vw, 485px"></figure></div>
<p>Select HC-05. Your smartphone will now connect to your HC-05.</p>
<p>You are now ready to send messages to your Arduino. Type in a message and click the arrow key to send the message to your Arduino. </p>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/21b-test-pairing-485x1024.jpg" alt="21b-test-pairing" class="wp-image-3570" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/21b-test-pairing-485x1024.jpg 485w, https://automaticaddison.com/wp-content/uploads/2019/11/21b-test-pairing-142x300.jpg 142w, https://automaticaddison.com/wp-content/uploads/2019/11/21b-test-pairing.jpg 600w" sizes="(max-width: 485px) 85vw, 485px"></figure></div>
<p> The message should show up on the Serial Monitor of your Arduino. </p>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/21-test_bluetooth_pairing.jpg" alt="21-test_bluetooth_pairing" class="wp-image-3568" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/21-test_bluetooth_pairing.jpg 600w, https://automaticaddison.com/wp-content/uploads/2019/11/21-test_bluetooth_pairing-300x136.jpg 300w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></figure></div>
<p>Congratulations! You have Bluetooth all set up on your Arduino.</p>
<p><strong><a href="https://automaticaddison.com/how-to-make-an-autonomous-wheeled-robot-using-ros/#top">Return to Table of Contents</a></strong></p>
<h1><a id="model"></a>Simulate the 3D Model of the Robot Using URDF</h1>
<p>You might be wondering…what the heck does URDF mean? URDF stands for <strong>Unified Robot Description Format</strong>. URDF is a text-based format (i.e. <a href="https://en.wikipedia.org/wiki/XML">XML format</a> or <a href="http://wiki.ros.org/xacro">Xacro format</a> to be more specific) that is used in ROS to describe all of the parts of a particular robot, including sensors, controllers, actuators, joints, links, etc. </p>
<p><strong>A URDF file tells a computer what a robot looks like in real life</strong> (i.e. its physical description). ROS can use the URDF file to create simulations of a robot before the roboticist builds and deploys the robot in the real world.</p>
<p>In this section, we’re going to focus on how to use a URDF file to simulate your wheeled robot. We will use a ready-made URDF file rather than building one from scratch. </p>
<p>If you want to learn how to build a URDF file from scratch, check out these tutorials on the ROS website: <a href="http://wiki.ros.org/urdf/Tutorials">http://wiki.ros.org/urdf/Tutorials</a>. You don’t need to go through those tutorials now. I do recommend, however, taking a look at <a href="http://wiki.ros.org/urdf/Tutorials/Building%20a%20Visual%20Robot%20Model%20with%20URDF%20from%20Scratch">this page to see a “hello world” example of URDF in ROS</a>.</p>
<p>Ok, now we are going to copy a ready-made mobile robot description package (that contains the URDF file we want) into our catkin_ws/src folder. Credit to Lentin Joseph, author of <a href="https://amzn.to/2O88yE1">Robot Operating System (ROS) for Absolute Beginners</a> for creating this package.</p>
<p>Open up a new Linux terminal window.</p>
<pre class="wp-block-preformatted">cd catkin_ws/src</pre>
<p>Download the mobile_robot_description package from Github to the catkin_ws/src folder.</p>
<pre class="wp-block-preformatted">svn checkout https://github.com/Apress/Robot-Operating-System-Abs-Begs/trunk/chapter_6/mobile_robot_description</pre>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/25_download_mobile_robot_package.jpg" alt="25_download_mobile_robot_package" class="wp-image-3581" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/25_download_mobile_robot_package.jpg 600w, https://automaticaddison.com/wp-content/uploads/2019/11/25_download_mobile_robot_package-300x225.jpg 300w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></figure></div>
<p>Build the package.</p>
<pre class="wp-block-preformatted">cd ~/catkin_ws</pre>
<pre class="wp-block-preformatted">catkin_make</pre>
<p>Now, type the following command to see a crude visualization of the wheeled robot in the visualization tool RViz.</p>
<pre class="wp-block-preformatted">roslaunch mobile_robot_description view_robot.launch</pre>
<p>Here is what you should see:</p>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/26_crude_model_of_robot.jpg" alt="26_crude_model_of_robot" class="wp-image-3583" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/26_crude_model_of_robot.jpg 596w, https://automaticaddison.com/wp-content/uploads/2019/11/26_crude_model_of_robot-300x248.jpg 300w" sizes="(max-width: 596px) 85vw, 596px"></figure></div>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/27-crude-model-of-robot-2.jpg" alt="27-crude-model-of-robot-2" class="wp-image-3584" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/27-crude-model-of-robot-2.jpg 600w, https://automaticaddison.com/wp-content/uploads/2019/11/27-crude-model-of-robot-2-300x165.jpg 300w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></figure></div>
<p>You can use your mouse to see the robot from different angles. It is kind of clunky trying to figure out how to maneuver about, but it is what it is.</p>
<p>To see the actual code of the launch file we just ran, go to the directory the file is located in.</p>
<pre class="wp-block-preformatted">cd ~/catkin_ws/src/mobile_robot_description/launch</pre>
<pre class="wp-block-preformatted">gedit view_robot.launch</pre>
<p>So now that you have seen how to run a URDF file, let’s take a look at how we can get our robot to do something useful by writing some code for it.</p>
<p><strong><a href="https://automaticaddison.com/how-to-make-an-autonomous-wheeled-robot-using-ros/#top">Return to Table of Contents</a></strong></p>
<h1><a id="robot_brain"></a>Program the Arduino (i.e. the “Brain” of the Robot)</h1>
<p>Now let’s get our hands dirty with some code. We need to program the Arduino board so that it can:</p>
<ol><li>Read the data from the HC-SRO5 ultrasonic sensor.</li><li>Control the motion of the robot.</li><li>Communicate with us on our PC.</li></ol>
<p>Here is the code:</p>
<div><div id="highlighter_775246" class="syntaxhighlighter cpp"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div><div class="line number2 index1 alt1">2</div><div class="line number3 index2 alt2">3</div><div class="line number4 index3 alt1">4</div><div class="line number5 index4 alt2">5</div><div class="line number6 index5 alt1">6</div><div class="line number7 index6 alt2">7</div><div class="line number8 index7 alt1">8</div><div class="line number9 index8 alt2">9</div><div class="line number10 index9 alt1">10</div><div class="line number11 index10 alt2">11</div><div class="line number12 index11 alt1">12</div><div class="line number13 index12 alt2">13</div><div class="line number14 index13 alt1">14</div><div class="line number15 index14 alt2">15</div><div class="line number16 index15 alt1">16</div><div class="line number17 index16 alt2">17</div><div class="line number18 index17 alt1">18</div><div class="line number19 index18 alt2">19</div><div class="line number20 index19 alt1">20</div><div class="line number21 index20 alt2">21</div><div class="line number22 index21 alt1">22</div><div class="line number23 index22 alt2">23</div><div class="line number24 index23 alt1">24</div><div class="line number25 index24 alt2">25</div><div class="line number26 index25 alt1">26</div><div class="line number27 index26 alt2">27</div><div class="line number28 index27 alt1">28</div><div class="line number29 index28 alt2">29</div><div class="line number30 index29 alt1">30</div><div class="line number31 index30 alt2">31</div><div class="line number32 index31 alt1">32</div><div class="line number33 index32 alt2">33</div><div class="line number34 index33 alt1">34</div><div class="line number35 index34 alt2">35</div><div class="line number36 index35 alt1">36</div><div class="line number37 index36 alt2">37</div><div class="line number38 index37 alt1">38</div><div class="line number39 index38 alt2">39</div><div class="line number40 index39 alt1">40</div><div class="line number41 index40 alt2">41</div><div class="line number42 index41 alt1">42</div><div class="line number43 index42 alt2">43</div><div class="line number44 index43 alt1">44</div><div class="line number45 index44 alt2">45</div><div class="line number46 index45 alt1">46</div><div class="line number47 index46 alt2">47</div><div class="line number48 index47 alt1">48</div><div class="line number49 index48 alt2">49</div><div class="line number50 index49 alt1">50</div><div class="line number51 index50 alt2">51</div><div class="line number52 index51 alt1">52</div><div class="line number53 index52 alt2">53</div><div class="line number54 index53 alt1">54</div><div class="line number55 index54 alt2">55</div><div class="line number56 index55 alt1">56</div><div class="line number57 index56 alt2">57</div><div class="line number58 index57 alt1">58</div><div class="line number59 index58 alt2">59</div><div class="line number60 index59 alt1">60</div><div class="line number61 index60 alt2">61</div><div class="line number62 index61 alt1">62</div><div class="line number63 index62 alt2">63</div><div class="line number64 index63 alt1">64</div><div class="line number65 index64 alt2">65</div><div class="line number66 index65 alt1">66</div><div class="line number67 index66 alt2">67</div><div class="line number68 index67 alt1">68</div><div class="line number69 index68 alt2">69</div><div class="line number70 index69 alt1">70</div><div class="line number71 index70 alt2">71</div><div class="line number72 index71 alt1">72</div><div class="line number73 index72 alt2">73</div><div class="line number74 index73 alt1">74</div><div class="line number75 index74 alt2">75</div><div class="line number76 index75 alt1">76</div><div class="line number77 index76 alt2">77</div><div class="line number78 index77 alt1">78</div><div class="line number79 index78 alt2">79</div><div class="line number80 index79 alt1">80</div><div class="line number81 index80 alt2">81</div><div class="line number82 index81 alt1">82</div><div class="line number83 index82 alt2">83</div><div class="line number84 index83 alt1">84</div><div class="line number85 index84 alt2">85</div><div class="line number86 index85 alt1">86</div><div class="line number87 index86 alt2">87</div><div class="line number88 index87 alt1">88</div><div class="line number89 index88 alt2">89</div><div class="line number90 index89 alt1">90</div><div class="line number91 index90 alt2">91</div><div class="line number92 index91 alt1">92</div><div class="line number93 index92 alt2">93</div><div class="line number94 index93 alt1">94</div><div class="line number95 index94 alt2">95</div><div class="line number96 index95 alt1">96</div><div class="line number97 index96 alt2">97</div><div class="line number98 index97 alt1">98</div><div class="line number99 index98 alt2">99</div><div class="line number100 index99 alt1">100</div><div class="line number101 index100 alt2">101</div><div class="line number102 index101 alt1">102</div><div class="line number103 index102 alt2">103</div><div class="line number104 index103 alt1">104</div><div class="line number105 index104 alt2">105</div><div class="line number106 index105 alt1">106</div><div class="line number107 index106 alt2">107</div><div class="line number108 index107 alt1">108</div><div class="line number109 index108 alt2">109</div><div class="line number110 index109 alt1">110</div><div class="line number111 index110 alt2">111</div><div class="line number112 index111 alt1">112</div><div class="line number113 index112 alt2">113</div><div class="line number114 index113 alt1">114</div><div class="line number115 index114 alt2">115</div><div class="line number116 index115 alt1">116</div><div class="line number117 index116 alt2">117</div><div class="line number118 index117 alt1">118</div><div class="line number119 index118 alt2">119</div><div class="line number120 index119 alt1">120</div><div class="line number121 index120 alt2">121</div><div class="line number122 index121 alt1">122</div><div class="line number123 index122 alt2">123</div><div class="line number124 index123 alt1">124</div><div class="line number125 index124 alt2">125</div><div class="line number126 index125 alt1">126</div><div class="line number127 index126 alt2">127</div><div class="line number128 index127 alt1">128</div><div class="line number129 index128 alt2">129</div><div class="line number130 index129 alt1">130</div><div class="line number131 index130 alt2">131</div><div class="line number132 index131 alt1">132</div><div class="line number133 index132 alt2">133</div><div class="line number134 index133 alt1">134</div><div class="line number135 index134 alt2">135</div><div class="line number136 index135 alt1">136</div><div class="line number137 index136 alt2">137</div><div class="line number138 index137 alt1">138</div><div class="line number139 index138 alt2">139</div><div class="line number140 index139 alt1">140</div><div class="line number141 index140 alt2">141</div><div class="line number142 index141 alt1">142</div><div class="line number143 index142 alt2">143</div><div class="line number144 index143 alt1">144</div><div class="line number145 index144 alt2">145</div><div class="line number146 index145 alt1">146</div><div class="line number147 index146 alt2">147</div><div class="line number148 index147 alt1">148</div><div class="line number149 index148 alt2">149</div><div class="line number150 index149 alt1">150</div><div class="line number151 index150 alt2">151</div><div class="line number152 index151 alt1">152</div><div class="line number153 index152 alt2">153</div><div class="line number154 index153 alt1">154</div><div class="line number155 index154 alt2">155</div><div class="line number156 index155 alt1">156</div><div class="line number157 index156 alt2">157</div><div class="line number158 index157 alt1">158</div><div class="line number159 index158 alt2">159</div><div class="line number160 index159 alt1">160</div><div class="line number161 index160 alt2">161</div><div class="line number162 index161 alt1">162</div><div class="line number163 index162 alt2">163</div><div class="line number164 index163 alt1">164</div><div class="line number165 index164 alt2">165</div><div class="line number166 index165 alt1">166</div><div class="line number167 index166 alt2">167</div><div class="line number168 index167 alt1">168</div><div class="line number169 index168 alt2">169</div><div class="line number170 index169 alt1">170</div><div class="line number171 index170 alt2">171</div><div class="line number172 index171 alt1">172</div><div class="line number173 index172 alt2">173</div><div class="line number174 index173 alt1">174</div><div class="line number175 index174 alt2">175</div><div class="line number176 index175 alt1">176</div><div class="line number177 index176 alt2">177</div><div class="line number178 index177 alt1">178</div><div class="line number179 index178 alt2">179</div><div class="line number180 index179 alt1">180</div><div class="line number181 index180 alt2">181</div><div class="line number182 index181 alt1">182</div><div class="line number183 index182 alt2">183</div><div class="line number184 index183 alt1">184</div><div class="line number185 index184 alt2">185</div><div class="line number186 index185 alt1">186</div><div class="line number187 index186 alt2">187</div><div class="line number188 index187 alt1">188</div><div class="line number189 index188 alt2">189</div><div class="line number190 index189 alt1">190</div><div class="line number191 index190 alt2">191</div><div class="line number192 index191 alt1">192</div><div class="line number193 index192 alt2">193</div><div class="line number194 index193 alt1">194</div><div class="line number195 index194 alt2">195</div><div class="line number196 index195 alt1">196</div><div class="line number197 index196 alt2">197</div><div class="line number198 index197 alt1">198</div><div class="line number199 index198 alt2">199</div><div class="line number200 index199 alt1">200</div><div class="line number201 index200 alt2">201</div><div class="line number202 index201 alt1">202</div><div class="line number203 index202 alt2">203</div><div class="line number204 index203 alt1">204</div><div class="line number205 index204 alt2">205</div><div class="line number206 index205 alt1">206</div><div class="line number207 index206 alt2">207</div><div class="line number208 index207 alt1">208</div><div class="line number209 index208 alt2">209</div><div class="line number210 index209 alt1">210</div><div class="line number211 index210 alt2">211</div><div class="line number212 index211 alt1">212</div><div class="line number213 index212 alt2">213</div><div class="line number214 index213 alt1">214</div><div class="line number215 index214 alt2">215</div><div class="line number216 index215 alt1">216</div><div class="line number217 index216 alt2">217</div><div class="line number218 index217 alt1">218</div><div class="line number219 index218 alt2">219</div><div class="line number220 index219 alt1">220</div><div class="line number221 index220 alt2">221</div><div class="line number222 index221 alt1">222</div><div class="line number223 index222 alt2">223</div><div class="line number224 index223 alt1">224</div><div class="line number225 index224 alt2">225</div><div class="line number226 index225 alt1">226</div><div class="line number227 index226 alt2">227</div><div class="line number228 index227 alt1">228</div><div class="line number229 index228 alt2">229</div><div class="line number230 index229 alt1">230</div><div class="line number231 index230 alt2">231</div><div class="line number232 index231 alt1">232</div><div class="line number233 index232 alt2">233</div><div class="line number234 index233 alt1">234</div><div class="line number235 index234 alt2">235</div><div class="line number236 index235 alt1">236</div><div class="line number237 index236 alt2">237</div><div class="line number238 index237 alt1">238</div><div class="line number239 index238 alt2">239</div><div class="line number240 index239 alt1">240</div><div class="line number241 index240 alt2">241</div><div class="line number242 index241 alt1">242</div><div class="line number243 index242 alt2">243</div><div class="line number244 index243 alt1">244</div><div class="line number245 index244 alt2">245</div><div class="line number246 index245 alt1">246</div><div class="line number247 index246 alt2">247</div><div class="line number248 index247 alt1">248</div><div class="line number249 index248 alt2">249</div><div class="line number250 index249 alt1">250</div><div class="line number251 index250 alt2">251</div><div class="line number252 index251 alt1">252</div><div class="line number253 index252 alt2">253</div><div class="line number254 index253 alt1">254</div><div class="line number255 index254 alt2">255</div><div class="line number256 index255 alt1">256</div><div class="line number257 index256 alt2">257</div><div class="line number258 index257 alt1">258</div><div class="line number259 index258 alt2">259</div><div class="line number260 index259 alt1">260</div><div class="line number261 index260 alt2">261</div><div class="line number262 index261 alt1">262</div><div class="line number263 index262 alt2">263</div><div class="line number264 index263 alt1">264</div><div class="line number265 index264 alt2">265</div><div class="line number266 index265 alt1">266</div><div class="line number267 index266 alt2">267</div><div class="line number268 index267 alt1">268</div><div class="line number269 index268 alt2">269</div><div class="line number270 index269 alt1">270</div><div class="line number271 index270 alt2">271</div><div class="line number272 index271 alt1">272</div><div class="line number273 index272 alt2">273</div><div class="line number274 index273 alt1">274</div><div class="line number275 index274 alt2">275</div><div class="line number276 index275 alt1">276</div><div class="line number277 index276 alt2">277</div><div class="line number278 index277 alt1">278</div><div class="line number279 index278 alt2">279</div><div class="line number280 index279 alt1">280</div><div class="line number281 index280 alt2">281</div><div class="line number282 index281 alt1">282</div><div class="line number283 index282 alt2">283</div><div class="line number284 index283 alt1">284</div><div class="line number285 index284 alt2">285</div><div class="line number286 index285 alt1">286</div><div class="line number287 index286 alt2">287</div><div class="line number288 index287 alt1">288</div><div class="line number289 index288 alt2">289</div><div class="line number290 index289 alt1">290</div><div class="line number291 index290 alt2">291</div><div class="line number292 index291 alt1">292</div><div class="line number293 index292 alt2">293</div><div class="line number294 index293 alt1">294</div><div class="line number295 index294 alt2">295</div><div class="line number296 index295 alt1">296</div><div class="line number297 index296 alt2">297</div><div class="line number298 index297 alt1">298</div><div class="line number299 index298 alt2">299</div><div class="line number300 index299 alt1">300</div><div class="line number301 index300 alt2">301</div><div class="line number302 index301 alt1">302</div><div class="line number303 index302 alt2">303</div><div class="line number304 index303 alt1">304</div><div class="line number305 index304 alt2">305</div><div class="line number306 index305 alt1">306</div><div class="line number307 index306 alt2">307</div><div class="line number308 index307 alt1">308</div><div class="line number309 index308 alt2">309</div><div class="line number310 index309 alt1">310</div><div class="line number311 index310 alt2">311</div><div class="line number312 index311 alt1">312</div><div class="line number313 index312 alt2">313</div><div class="line number314 index313 alt1">314</div><div class="line number315 index314 alt2">315</div><div class="line number316 index315 alt1">316</div><div class="line number317 index316 alt2">317</div><div class="line number318 index317 alt1">318</div><div class="line number319 index318 alt2">319</div><div class="line number320 index319 alt1">320</div><div class="line number321 index320 alt2">321</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="cpp comments">// Project Name: Autonomous Obstacle-Avoiding Wheeled Robot</code></div><div class="line number2 index1 alt1"> </div><div class="line number3 index2 alt2"><code class="cpp comments">// Author: Addison Sears-Collins</code></div><div class="line number4 index3 alt1"> </div><div class="line number5 index4 alt2"><code class="cpp comments">// This code is used to drive a two-wheeled differential </code></div><div class="line number6 index5 alt1"><code class="cpp comments">// drive robot. </code></div><div class="line number7 index6 alt2"><code class="cpp comments">// You will need to modify the pins according</code></div><div class="line number8 index7 alt1"><code class="cpp comments">// to the wiring connections you made when assembling </code></div><div class="line number9 index8 alt2"><code class="cpp comments">// the robot. </code></div><div class="line number10 index9 alt1"> </div><div class="line number11 index10 alt2"><code class="cpp comments">// Set up Serial connection with Bluetooth module</code></div><div class="line number12 index11 alt1"><code class="cpp preprocessor">#include <SoftwareSerial.h></code></div><div class="line number13 index12 alt2"> </div><div class="line number14 index13 alt1"><code class="cpp comments">//(Receiver RX | Trasmitter TX)</code></div><div class="line number15 index14 alt2"><code class="cpp plain">SoftwareSerial EEBlue(2, 3); </code></div><div class="line number16 index15 alt1"> </div><div class="line number17 index16 alt2"><code class="cpp comments">////////////////////////////////////////////////////////</code></div><div class="line number18 index17 alt1"> </div><div class="line number19 index18 alt2"><code class="cpp comments">//Module to interface with the ultrasonic sensor</code></div><div class="line number20 index19 alt1"><code class="cpp preprocessor">#define TRIGGER_PIN 12 //Arduino pin connected to TRIG</code></div><div class="line number21 index20 alt2"><code class="cpp preprocessor">#define ECHO_PIN 13 //Arduino pin connected to ECHO</code></div><div class="line number22 index21 alt1"> </div><div class="line number23 index22 alt2"><code class="cpp comments">////////////////////////////////////////////////////////</code></div><div class="line number24 index23 alt1"> </div><div class="line number25 index24 alt2"><code class="cpp comments">//Setup Ultrasonic sensor</code></div><div class="line number26 index25 alt1"><code class="cpp keyword bold">void</code> <code class="cpp plain">Setup_Ultrasonic()</code></div><div class="line number27 index26 alt2"><code class="cpp plain">{</code></div><div class="line number28 index27 alt1"> </div><div class="line number29 index28 alt2"><code class="cpp spaces"> </code><code class="cpp comments">// Define each pin as an input or output.</code></div><div class="line number30 index29 alt1"><code class="cpp spaces"> </code><code class="cpp plain">pinMode(ECHO_PIN, INPUT);</code></div><div class="line number31 index30 alt2"><code class="cpp spaces"> </code><code class="cpp plain">pinMode(TRIGGER_PIN, OUTPUT);</code></div><div class="line number32 index31 alt1"><code class="cpp spaces"> </code> </div><div class="line number33 index32 alt2"><code class="cpp plain">}</code></div><div class="line number34 index33 alt1"> </div><div class="line number35 index34 alt2"><code class="cpp comments">////////////////////////////////////////////////////////</code></div><div class="line number36 index35 alt1"> </div><div class="line number37 index36 alt2"><code class="cpp spaces"> </code><code class="cpp comments">/* Motor driver pin definitions and mappings to Arduino</code></div><div class="line number38 index37 alt1"><code class="cpp spaces"> </code><code class="cpp comments">* </code></div><div class="line number39 index38 alt2"><code class="cpp spaces"> </code><code class="cpp comments">* </code></div><div class="line number40 index39 alt1"><code class="cpp spaces"> </code><code class="cpp comments">*/</code></div><div class="line number41 index40 alt2"> </div><div class="line number42 index41 alt1"><code class="cpp comments">/* MOTOR PIN DEFINITIONS </code></div><div class="line number43 index42 alt2"> </div><div class="line number44 index43 alt1"><code class="cpp comments">ARDUINO DIGITAL PIN |||| MOTOR DRIVER (L298 PIN)</code></div><div class="line number45 index44 alt2"> </div><div class="line number46 index45 alt1"><code class="cpp spaces"> </code><code class="cpp comments">5 ENA (Enable 1 - Left Motor)</code></div><div class="line number47 index46 alt2"><code class="cpp spaces"> </code> </div><div class="line number48 index47 alt1"><code class="cpp spaces"> </code><code class="cpp comments">6 IN1</code></div><div class="line number49 index48 alt2"><code class="cpp spaces"> </code> </div><div class="line number50 index49 alt1"><code class="cpp spaces"> </code><code class="cpp comments">7 IN2</code></div><div class="line number51 index50 alt2"><code class="cpp spaces"> </code> </div><div class="line number52 index51 alt1"><code class="cpp spaces"> </code><code class="cpp comments">8 ENB (Enable 2 - Right Motor)</code></div><div class="line number53 index52 alt2"><code class="cpp spaces"> </code> </div><div class="line number54 index53 alt1"><code class="cpp spaces"> </code><code class="cpp comments">10 IN4</code></div><div class="line number55 index54 alt2"><code class="cpp spaces"> </code> </div><div class="line number56 index55 alt1"><code class="cpp spaces"> </code><code class="cpp comments">9 IN3</code></div><div class="line number57 index56 alt2"><code class="cpp spaces"> </code> </div><div class="line number58 index57 alt1"> </div><div class="line number59 index58 alt2"> </div><div class="line number60 index59 alt1"><code class="cpp comments">*/</code></div><div class="line number61 index60 alt2"> </div><div class="line number62 index61 alt1"> </div><div class="line number63 index62 alt2"><code class="cpp preprocessor">#define enableA 5 // Connected to Left Motor</code></div><div class="line number64 index63 alt1"><code class="cpp preprocessor">#define MotorA1 6</code></div><div class="line number65 index64 alt2"><code class="cpp preprocessor">#define MotorA2 7</code></div><div class="line number66 index65 alt1"> </div><div class="line number67 index66 alt2"><code class="cpp preprocessor">#define enableB 8 //Connected to Right Motor</code></div><div class="line number68 index67 alt1"><code class="cpp preprocessor">#define MotorB1 9</code></div><div class="line number69 index68 alt2"><code class="cpp preprocessor">#define MotorB2 10</code></div><div class="line number70 index69 alt1"> </div><div class="line number71 index70 alt2"> </div><div class="line number72 index71 alt1"><code class="cpp comments">///////////////////////////////////////////////////////</code></div><div class="line number73 index72 alt2"> </div><div class="line number74 index73 alt1"><code class="cpp comments">//Initializes the motor pins that are defined as MACROS</code></div><div class="line number75 index74 alt2"><code class="cpp keyword bold">void</code> <code class="cpp plain">Setup_Motors()</code></div><div class="line number76 index75 alt1"><code class="cpp plain">{</code></div><div class="line number77 index76 alt2"><code class="cpp spaces"> </code> </div><div class="line number78 index77 alt1"><code class="cpp spaces"> </code><code class="cpp comments">// Set up left motor</code></div><div class="line number79 index78 alt2"><code class="cpp spaces"> </code><code class="cpp plain">pinMode(enableA,OUTPUT);</code></div><div class="line number80 index79 alt1"><code class="cpp spaces"> </code><code class="cpp plain">pinMode(MotorA1,OUTPUT);</code></div><div class="line number81 index80 alt2"><code class="cpp spaces"> </code><code class="cpp plain">pinMode(MotorA2,OUTPUT);</code></div><div class="line number82 index81 alt1"> </div><div class="line number83 index82 alt2"><code class="cpp spaces"> </code><code class="cpp comments">// Set up right motor</code></div><div class="line number84 index83 alt1"><code class="cpp spaces"> </code><code class="cpp plain">pinMode(enableB,OUTPUT);</code></div><div class="line number85 index84 alt2"><code class="cpp spaces"> </code><code class="cpp plain">pinMode(MotorB1,OUTPUT);</code></div><div class="line number86 index85 alt1"><code class="cpp spaces"> </code><code class="cpp plain">pinMode(MotorB2,OUTPUT);</code></div><div class="line number87 index86 alt2"><code class="cpp spaces"> </code> </div><div class="line number88 index87 alt1"><code class="cpp spaces"> </code><code class="cpp plain">delay(200); </code><code class="cpp comments">// Pause 200 milliseconds </code></div><div class="line number89 index88 alt2"><code class="cpp spaces"> </code> </div><div class="line number90 index89 alt1"><code class="cpp spaces"> </code><code class="cpp plain">go_forward(); </code><code class="cpp comments">// Move forward</code></div><div class="line number91 index90 alt2"><code class="cpp spaces"> </code> </div><div class="line number92 index91 alt1"><code class="cpp plain">}</code></div><div class="line number93 index92 alt2"> </div><div class="line number94 index93 alt1"><code class="cpp comments">////////////////////////////////////////////////////////</code></div><div class="line number95 index94 alt2"> </div><div class="line number96 index95 alt1"><code class="cpp comments">//Setup Serial communication</code></div><div class="line number97 index96 alt2"><code class="cpp keyword bold">void</code> <code class="cpp plain">Setup_Serial(</code><code class="cpp color1 bold">int</code> <code class="cpp plain">baud_rate)</code></div><div class="line number98 index97 alt1"><code class="cpp plain">{</code></div><div class="line number99 index98 alt2"> </div><div class="line number100 index99 alt1"><code class="cpp spaces"> </code><code class="cpp plain">Serial.begin(9600); </code></div><div class="line number101 index100 alt2"><code class="cpp spaces"> </code><code class="cpp plain">EEBlue.begin(9600); </code><code class="cpp comments">//Default Baud for communications</code></div><div class="line number102 index101 alt1"><code class="cpp spaces"> </code> </div><div class="line number103 index102 alt2"><code class="cpp plain">}</code></div><div class="line number104 index103 alt1"> </div><div class="line number105 index104 alt2"> </div><div class="line number106 index105 alt1"><code class="cpp comments">//////////////////////////////////////////////////////</code></div><div class="line number107 index106 alt2"><code class="cpp comments">// Returns the distance to the obstacle as an integer</code></div><div class="line number108 index107 alt1"><code class="cpp color1 bold">int</code> <code class="cpp plain">Update_Ultrasonic()</code></div><div class="line number109 index108 alt2"><code class="cpp plain">{</code></div><div class="line number110 index109 alt1"> </div><div class="line number111 index110 alt2"><code class="cpp spaces"> </code><code class="cpp color1 bold">int</code> <code class="cpp plain">distance = 0;</code></div><div class="line number112 index111 alt1"><code class="cpp spaces"> </code><code class="cpp color1 bold">int</code> <code class="cpp plain">average = 0;</code></div><div class="line number113 index112 alt2"><code class="cpp spaces"> </code> </div><div class="line number114 index113 alt1"><code class="cpp spaces"> </code><code class="cpp comments">// Grab four measurements of distance and calculate</code></div><div class="line number115 index114 alt2"><code class="cpp spaces"> </code><code class="cpp comments">// the average.</code></div><div class="line number116 index115 alt1"><code class="cpp spaces"> </code><code class="cpp keyword bold">for</code> <code class="cpp plain">(</code><code class="cpp color1 bold">int</code> <code class="cpp plain">i = 0; i < 4; i++) {</code></div><div class="line number117 index116 alt2"><code class="cpp spaces"> </code> </div><div class="line number118 index117 alt1"><code class="cpp spaces"> </code><code class="cpp comments">// Make the TRIGGER_PIN LOW (0 volts) </code></div><div class="line number119 index118 alt2"><code class="cpp spaces"> </code><code class="cpp comments">// for 2 microseconds</code></div><div class="line number120 index119 alt1"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite(TRIGGER_PIN, LOW);</code></div><div class="line number121 index120 alt2"><code class="cpp spaces"> </code><code class="cpp plain">delayMicroseconds(2); </code></div><div class="line number122 index121 alt1"><code class="cpp spaces"> </code> </div><div class="line number123 index122 alt2"><code class="cpp spaces"> </code><code class="cpp comments">// Emit high frequency 40kHz sound pulse</code></div><div class="line number124 index123 alt1"><code class="cpp spaces"> </code><code class="cpp comments">// (i.e. pull the TRIGGER_PIN) </code></div><div class="line number125 index124 alt2"><code class="cpp spaces"> </code><code class="cpp comments">// by making TRIGGER_PIN HIGH (5 volts) </code></div><div class="line number126 index125 alt1"><code class="cpp spaces"> </code><code class="cpp comments">// for 10 microseconds</code></div><div class="line number127 index126 alt2"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite(TRIGGER_PIN, HIGH);</code></div><div class="line number128 index127 alt1"><code class="cpp spaces"> </code><code class="cpp plain">delayMicroseconds(10);</code></div><div class="line number129 index128 alt2"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite(TRIGGER_PIN, LOW);</code></div><div class="line number130 index129 alt1"><code class="cpp spaces"> </code> </div><div class="line number131 index130 alt2"><code class="cpp spaces"> </code><code class="cpp comments">// Detect a pulse on the ECHO_PIN pin 8. </code></div><div class="line number132 index131 alt1"><code class="cpp spaces"> </code><code class="cpp comments">// pulseIn() measures the time in </code></div><div class="line number133 index132 alt2"><code class="cpp spaces"> </code><code class="cpp comments">// microseconds until the sound pulse</code></div><div class="line number134 index133 alt1"><code class="cpp spaces"> </code><code class="cpp comments">// returns back to the sensor. </code></div><div class="line number135 index134 alt2"><code class="cpp spaces"> </code><code class="cpp plain">distance = pulseIn(ECHO_PIN, HIGH);</code></div><div class="line number136 index135 alt1"><code class="cpp spaces"> </code> </div><div class="line number137 index136 alt2"><code class="cpp spaces"> </code><code class="cpp comments">// Speed of sound is:</code></div><div class="line number138 index137 alt1"><code class="cpp spaces"> </code><code class="cpp comments">// 13511.811023622 inches per second</code></div><div class="line number139 index138 alt2"><code class="cpp spaces"> </code><code class="cpp comments">// 13511.811023622/10^6 inches per microsecond</code></div><div class="line number140 index139 alt1"><code class="cpp spaces"> </code><code class="cpp comments">// 0.013511811 inches per microsecond</code></div><div class="line number141 index140 alt2"><code class="cpp spaces"> </code><code class="cpp comments">// Taking the reciprocal, we have:</code></div><div class="line number142 index141 alt1"><code class="cpp spaces"> </code><code class="cpp comments">// 74.00932414 microseconds per inch </code></div><div class="line number143 index142 alt2"><code class="cpp spaces"> </code><code class="cpp comments">// Below, we convert microseconds to inches by </code></div><div class="line number144 index143 alt1"><code class="cpp spaces"> </code><code class="cpp comments">// dividing by 74 and then dividing by 2</code></div><div class="line number145 index144 alt2"><code class="cpp spaces"> </code><code class="cpp comments">// to account for the roundtrip time.</code></div><div class="line number146 index145 alt1"><code class="cpp spaces"> </code><code class="cpp plain">distance = distance / 74 / 2;</code></div><div class="line number147 index146 alt2"><code class="cpp spaces"> </code> </div><div class="line number148 index147 alt1"><code class="cpp spaces"> </code><code class="cpp comments">// Compute running sum</code></div><div class="line number149 index148 alt2"><code class="cpp spaces"> </code><code class="cpp plain">average += distance;</code></div><div class="line number150 index149 alt1"><code class="cpp spaces"> </code> </div><div class="line number151 index150 alt2"><code class="cpp spaces"> </code><code class="cpp comments">// Wait 10 milliseconds between pings</code></div><div class="line number152 index151 alt1"><code class="cpp spaces"> </code><code class="cpp plain">delay(10);</code></div><div class="line number153 index152 alt2"><code class="cpp spaces"> </code><code class="cpp plain">}</code></div><div class="line number154 index153 alt1"><code class="cpp spaces"> </code> </div><div class="line number155 index154 alt2"><code class="cpp spaces"> </code><code class="cpp plain">distance = average / 4;</code></div><div class="line number156 index155 alt1"> </div><div class="line number157 index156 alt2"><code class="cpp spaces"> </code><code class="cpp plain">Serial.print(</code><code class="cpp string">"u "</code><code class="cpp plain">);</code></div><div class="line number158 index157 alt1"><code class="cpp spaces"> </code><code class="cpp plain">Serial.print(distance);</code></div><div class="line number159 index158 alt2"><code class="cpp spaces"> </code><code class="cpp plain">Serial.print(</code><code class="cpp string">"\n"</code><code class="cpp plain">); </code></div><div class="line number160 index159 alt1"> </div><div class="line number161 index160 alt2"><code class="cpp spaces"> </code><code class="cpp color1 bold">int</code> <code class="cpp plain">distance_copy = distance;</code></div><div class="line number162 index161 alt1"> </div><div class="line number163 index162 alt2"><code class="cpp spaces"> </code><code class="cpp comments">// Initialize string</code></div><div class="line number164 index163 alt1"><code class="cpp spaces"> </code><code class="cpp color1 bold">char</code> <code class="cpp plain">str[] = </code><code class="cpp string">"u "</code><code class="cpp plain">;</code></div><div class="line number165 index164 alt2"><code class="cpp spaces"> </code><code class="cpp color1 bold">char</code> <code class="cpp plain">str_dist[10];</code></div><div class="line number166 index165 alt1"> </div><div class="line number167 index166 alt2"><code class="cpp spaces"> </code><code class="cpp comments">// Convert distance integer into a string</code></div><div class="line number168 index167 alt1"><code class="cpp spaces"> </code><code class="cpp functions bold">sprintf</code><code class="cpp plain">(str_dist, </code><code class="cpp string">"%d"</code><code class="cpp plain">, distance_copy);</code></div><div class="line number169 index168 alt2"> </div><div class="line number170 index169 alt1"><code class="cpp spaces"> </code><code class="cpp comments">// Add a new line</code></div><div class="line number171 index170 alt2"><code class="cpp spaces"> </code><code class="cpp color1 bold">char</code> <code class="cpp plain">add_new_line[] = </code><code class="cpp string">"\n"</code><code class="cpp plain">;</code></div><div class="line number172 index171 alt1"> </div><div class="line number173 index172 alt2"><code class="cpp spaces"> </code><code class="cpp comments">// Concatenate to produce the new string</code></div><div class="line number174 index173 alt1"><code class="cpp spaces"> </code><code class="cpp functions bold">strcat</code><code class="cpp plain">(str_dist, add_new_line); </code></div><div class="line number175 index174 alt2"><code class="cpp spaces"> </code><code class="cpp functions bold">strcat</code><code class="cpp plain">(str, str_dist); </code></div><div class="line number176 index175 alt1"> </div><div class="line number177 index176 alt2"><code class="cpp spaces"> </code><code class="cpp comments">// Output data to bluetooth</code></div><div class="line number178 index177 alt1"><code class="cpp spaces"> </code><code class="cpp plain">EEBlue.write(str);</code></div><div class="line number179 index178 alt2"> </div><div class="line number180 index179 alt1"><code class="cpp spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">distance; </code></div><div class="line number181 index180 alt2"> </div><div class="line number182 index181 alt1"><code class="cpp plain">}</code></div><div class="line number183 index182 alt2"> </div><div class="line number184 index183 alt1"><code class="cpp comments">//////////////////////////////////////////////////////////</code></div><div class="line number185 index184 alt2"><code class="cpp comments">// The following function controls </code></div><div class="line number186 index185 alt1"><code class="cpp comments">// the motion of the robot</code></div><div class="line number187 index186 alt2"> </div><div class="line number188 index187 alt1"><code class="cpp keyword bold">void</code> <code class="cpp plain">Move_Robot(</code><code class="cpp color1 bold">int</code> <code class="cpp plain">distance)</code></div><div class="line number189 index188 alt2"><code class="cpp plain">{</code></div><div class="line number190 index189 alt1"><code class="cpp spaces"> </code> </div><div class="line number191 index190 alt2"><code class="cpp spaces"> </code><code class="cpp comments">// If obstacle <= 2 inches away</code></div><div class="line number192 index191 alt1"><code class="cpp spaces"> </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(distance >= 0 &amp;&amp; distance <= 2) { </code></div><div class="line number193 index192 alt2"><code class="cpp spaces"> </code><code class="cpp plain">go_backwards(); </code><code class="cpp comments">// Move in reverse for 0.5 seconds</code></div><div class="line number194 index193 alt1"><code class="cpp spaces"> </code><code class="cpp plain">delay(500);</code></div><div class="line number195 index194 alt2"><code class="cpp spaces"> </code> </div><div class="line number196 index195 alt1"><code class="cpp spaces"> </code><code class="cpp comments">/* Go left or right to avoid the obstacle*/</code></div><div class="line number197 index196 alt2"><code class="cpp spaces"> </code><code class="cpp keyword bold">if</code> <code class="cpp plain">(random(2) == 0) { </code><code class="cpp comments">// Generates 0 or 1, randomly </code></div><div class="line number198 index197 alt1"><code class="cpp spaces"> </code><code class="cpp plain">go_right(); </code><code class="cpp comments">// Turn right for one second</code></div><div class="line number199 index198 alt2"><code class="cpp spaces"> </code><code class="cpp plain">}</code></div><div class="line number200 index199 alt1"><code class="cpp spaces"> </code><code class="cpp keyword bold">else</code> <code class="cpp plain">{</code></div><div class="line number201 index200 alt2"><code class="cpp spaces"> </code><code class="cpp plain">go_left(); </code><code class="cpp comments">// Turn left for one second</code></div><div class="line number202 index201 alt1"><code class="cpp spaces"> </code><code class="cpp plain">}</code></div><div class="line number203 index202 alt2"><code class="cpp spaces"> </code><code class="cpp plain">delay(1000);</code></div><div class="line number204 index203 alt1"><code class="cpp spaces"> </code><code class="cpp plain">go_forward(); </code><code class="cpp comments">// Move forward</code></div><div class="line number205 index204 alt2"><code class="cpp spaces"> </code><code class="cpp plain">}</code></div><div class="line number206 index205 alt1"><code class="cpp spaces"> </code><code class="cpp plain">delay(50); </code><code class="cpp comments">// Wait 50 milliseconds before pinging again </code></div><div class="line number207 index206 alt2"><code class="cpp plain">}</code></div><div class="line number208 index207 alt1"> </div><div class="line number209 index208 alt2"><code class="cpp comments">/* </code></div><div class="line number210 index209 alt1"><code class="cpp spaces"> </code><code class="cpp comments">* Forwards, backwards, right, left, stop.</code></div><div class="line number211 index210 alt2"><code class="cpp spaces"> </code><code class="cpp comments">*/</code></div><div class="line number212 index211 alt1"><code class="cpp keyword bold">void</code> <code class="cpp plain">go_forward() {</code></div><div class="line number213 index212 alt2"><code class="cpp spaces"> </code><code class="cpp comments">//enabling motor A and B</code></div><div class="line number214 index213 alt1"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite (enableA, HIGH);</code></div><div class="line number215 index214 alt2"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite (enableB, HIGH);</code></div><div class="line number216 index215 alt1"><code class="cpp spaces"> </code> </div><div class="line number217 index216 alt2"><code class="cpp spaces"> </code><code class="cpp comments">// Move forward</code></div><div class="line number218 index217 alt1"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite (MotorA1, LOW);</code></div><div class="line number219 index218 alt2"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite (MotorA2, HIGH);</code></div><div class="line number220 index219 alt1"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite (MotorB1, LOW);</code></div><div class="line number221 index220 alt2"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite (MotorB2, HIGH);</code></div><div class="line number222 index221 alt1"> </div><div class="line number223 index222 alt2"><code class="cpp plain">}</code></div><div class="line number224 index223 alt1"><code class="cpp keyword bold">void</code> <code class="cpp plain">go_backwards() {</code></div><div class="line number225 index224 alt2"><code class="cpp spaces"> </code><code class="cpp comments">//enabling motor A and B</code></div><div class="line number226 index225 alt1"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite (enableA, HIGH);</code></div><div class="line number227 index226 alt2"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite (enableB, HIGH);</code></div><div class="line number228 index227 alt1"><code class="cpp spaces"> </code> </div><div class="line number229 index228 alt2"><code class="cpp spaces"> </code><code class="cpp comments">// Go backwards</code></div><div class="line number230 index229 alt1"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite (MotorA1,HIGH);</code></div><div class="line number231 index230 alt2"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite (MotorA2,LOW); </code></div><div class="line number232 index231 alt1"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite (MotorB1,HIGH);</code></div><div class="line number233 index232 alt2"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite (MotorB2,LOW); </code></div><div class="line number234 index233 alt1"><code class="cpp spaces"> </code> </div><div class="line number235 index234 alt2"><code class="cpp plain">}</code></div><div class="line number236 index235 alt1"><code class="cpp keyword bold">void</code> <code class="cpp plain">go_right() {</code></div><div class="line number237 index236 alt2"><code class="cpp spaces"> </code><code class="cpp comments">//enabling motor A and B</code></div><div class="line number238 index237 alt1"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite (enableA, HIGH);</code></div><div class="line number239 index238 alt2"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite (enableB, HIGH);</code></div><div class="line number240 index239 alt1"><code class="cpp spaces"> </code> </div><div class="line number241 index240 alt2"><code class="cpp spaces"> </code><code class="cpp comments">// Turn right</code></div><div class="line number242 index241 alt1"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite (MotorA1, LOW);</code></div><div class="line number243 index242 alt2"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite (MotorA2, HIGH);</code></div><div class="line number244 index243 alt1"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite (MotorB1,HIGH);</code></div><div class="line number245 index244 alt2"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite (MotorB2,LOW); </code></div><div class="line number246 index245 alt1"><code class="cpp plain">}</code></div><div class="line number247 index246 alt2"><code class="cpp keyword bold">void</code> <code class="cpp plain">go_left() {</code></div><div class="line number248 index247 alt1"><code class="cpp spaces"> </code><code class="cpp comments">//enabling motor A and B</code></div><div class="line number249 index248 alt2"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite (enableA, HIGH);</code></div><div class="line number250 index249 alt1"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite (enableB, HIGH);</code></div><div class="line number251 index250 alt2"><code class="cpp spaces"> </code> </div><div class="line number252 index251 alt1"><code class="cpp spaces"> </code><code class="cpp comments">// Turn left</code></div><div class="line number253 index252 alt2"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite (MotorA1,HIGH);</code></div><div class="line number254 index253 alt1"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite (MotorA2,LOW); </code></div><div class="line number255 index254 alt2"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite (MotorB1, LOW);</code></div><div class="line number256 index255 alt1"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite (MotorB2, HIGH);</code></div><div class="line number257 index256 alt2"><code class="cpp plain">}</code></div><div class="line number258 index257 alt1"><code class="cpp keyword bold">void</code> <code class="cpp plain">stop_all() {</code></div><div class="line number259 index258 alt2"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite (enableA, LOW);</code></div><div class="line number260 index259 alt1"><code class="cpp spaces"> </code><code class="cpp plain">digitalWrite (enableB, LOW);</code></div><div class="line number261 index260 alt2"><code class="cpp plain">}</code></div><div class="line number262 index261 alt1"> </div><div class="line number263 index262 alt2"><code class="cpp comments">//////////////////////////////////////////////////</code></div><div class="line number264 index263 alt1"><code class="cpp comments">//Read from Serial Function</code></div><div class="line number265 index264 alt2"> </div><div class="line number266 index265 alt1"><code class="cpp keyword bold">void</code> <code class="cpp plain">Read_From_Serial()</code></div><div class="line number267 index266 alt2"><code class="cpp plain">{</code></div><div class="line number268 index267 alt1"><code class="cpp spaces"> </code><code class="cpp comments">// Read data from Serial terminal of Arduino IDE</code></div><div class="line number269 index268 alt2"><code class="cpp spaces"> </code><code class="cpp keyword bold">while</code><code class="cpp plain">(Serial.available() > 0)</code></div><div class="line number270 index269 alt1"><code class="cpp spaces"> </code><code class="cpp plain">{ </code></div><div class="line number271 index270 alt2"><code class="cpp spaces"> </code><code class="cpp plain">EEBlue.write(Serial.read()); </code></div><div class="line number272 index271 alt1"><code class="cpp spaces"> </code><code class="cpp plain">} </code></div><div class="line number273 index272 alt2"> </div><div class="line number274 index273 alt1"><code class="cpp spaces"> </code><code class="cpp comments">// Read data from Bluetooth module</code></div><div class="line number275 index274 alt2"><code class="cpp spaces"> </code><code class="cpp comments">//while(EEBlue.available() > 0)</code></div><div class="line number276 index275 alt1"><code class="cpp spaces"> </code><code class="cpp comments">// {</code></div><div class="line number277 index276 alt2"><code class="cpp spaces"> </code><code class="cpp comments">// Serial.write(EEBlue.read()); </code></div><div class="line number278 index277 alt1"><code class="cpp spaces"> </code><code class="cpp comments">// int data = Serial.read(); </code></div><div class="line number279 index278 alt2"><code class="cpp spaces"> </code> </div><div class="line number280 index279 alt1"><code class="cpp spaces"> </code><code class="cpp comments">// } </code></div><div class="line number281 index280 alt2"> </div><div class="line number282 index281 alt1"><code class="cpp plain">}</code></div><div class="line number283 index282 alt2"> </div><div class="line number284 index283 alt1"><code class="cpp comments">////////////////////////////////////////</code></div><div class="line number285 index284 alt2"><code class="cpp comments">//Update all</code></div><div class="line number286 index285 alt1"><code class="cpp keyword bold">void</code> <code class="cpp plain">Update_all()</code></div><div class="line number287 index286 alt2"><code class="cpp plain">{</code></div><div class="line number288 index287 alt1"><code class="cpp spaces"> </code> </div><div class="line number289 index288 alt2"><code class="cpp spaces"> </code><code class="cpp color1 bold">int</code> <code class="cpp plain">distance = Update_Ultrasonic();</code></div><div class="line number290 index289 alt1"><code class="cpp spaces"> </code> </div><div class="line number291 index290 alt2"><code class="cpp spaces"> </code><code class="cpp plain">Read_From_Serial();</code></div><div class="line number292 index291 alt1"><code class="cpp spaces"> </code> </div><div class="line number293 index292 alt2"><code class="cpp spaces"> </code><code class="cpp plain">Move_Robot(distance);</code></div><div class="line number294 index293 alt1"><code class="cpp spaces"> </code> </div><div class="line number295 index294 alt2"><code class="cpp plain">}</code></div><div class="line number296 index295 alt1"> </div><div class="line number297 index296 alt2"> </div><div class="line number298 index297 alt1"><code class="cpp comments">/////////////////////////////////////////</code></div><div class="line number299 index298 alt2"><code class="cpp comments">// Setup function for Arduino</code></div><div class="line number300 index299 alt1"><code class="cpp keyword bold">void</code> <code class="cpp plain">setup() {</code></div><div class="line number301 index300 alt2"> </div><div class="line number302 index301 alt1"><code class="cpp spaces"> </code><code class="cpp comments">// Initializes the pseudo-random number generator</code></div><div class="line number303 index302 alt2"><code class="cpp spaces"> </code><code class="cpp comments">// Needed for the robot to wander around the room</code></div><div class="line number304 index303 alt1"><code class="cpp spaces"> </code><code class="cpp plain">randomSeed(analogRead(3));</code></div><div class="line number305 index304 alt2"><code class="cpp spaces"> </code> </div><div class="line number306 index305 alt1"><code class="cpp spaces"> </code><code class="cpp plain">Setup_Ultrasonic();</code></div><div class="line number307 index306 alt2"> </div><div class="line number308 index307 alt1"><code class="cpp spaces"> </code><code class="cpp plain">Setup_Serial(9600);</code></div><div class="line number309 index308 alt2"><code class="cpp spaces"> </code> </div><div class="line number310 index309 alt1"><code class="cpp spaces"> </code><code class="cpp plain">Setup_Motors(); </code></div><div class="line number311 index310 alt2"> </div><div class="line number312 index311 alt1"><code class="cpp plain">}</code></div><div class="line number313 index312 alt2"><code class="cpp comments">///////////////////////////////////////</code></div><div class="line number314 index313 alt1"><code class="cpp comments">// This part loops over and over again</code></div><div class="line number315 index314 alt2"><code class="cpp keyword bold">void</code> <code class="cpp plain">loop() {</code></div><div class="line number316 index315 alt1"> </div><div class="line number317 index316 alt2"> </div><div class="line number318 index317 alt1"><code class="cpp spaces"> </code><code class="cpp plain">Update_all();</code></div><div class="line number319 index318 alt2"> </div><div class="line number320 index319 alt1"><code class="cpp spaces"> </code> </div><div class="line number321 index320 alt2"><code class="cpp plain">}</code></div></div></td></tr></tbody></table></div></div>
<p>Let’s test the code. With your robot connected to your PC via the USB cord, upload the code to your Arduino board.</p>
<p>Unplug the Arduino from your computer.</p>
<p>Arduino can handle an input supply voltage from 7 – 12V, so let’s add a 9V battery to the board using Velcro fasteners. You can also use some multi-purpose black cable ties.</p>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/29-9v-battery.jpg" alt="29-9v-battery" class="wp-image-3585" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/29-9v-battery.jpg 600w, https://automaticaddison.com/wp-content/uploads/2019/11/29-9v-battery-300x225.jpg 300w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></figure></div>
<p>Before you plug the battery into your Arduino, make sure your Arduino is somewhere on the floor with a lot of space. Hardwood or smooth floors work best. The robot’s motors are not powerful enough to move through thick carpet.</p>
<p>Turn on the motors by switching on the 4×1.5V AA battery pack.</p>
<p>Now plug in the Arduino. The Arduino program you burned into your board will start automatically whenever power is supplied.</p>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/29c-9v-battery-connection.jpg" alt="29c-9v-battery-connection" class="wp-image-3587" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/29c-9v-battery-connection.jpg 600w, https://automaticaddison.com/wp-content/uploads/2019/11/29c-9v-battery-connection-300x225.jpg 300w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></figure></div>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/29b-9v-battery-connection-to-arduino.jpg" alt="29b-9v-battery-connection-to-arduino" class="wp-image-3586" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/29b-9v-battery-connection-to-arduino.jpg 600w, https://automaticaddison.com/wp-content/uploads/2019/11/29b-9v-battery-connection-to-arduino-300x225.jpg 300w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></figure></div>
<p>If your car does not automatically start, put your hand in front of the ultrasonic sensor to get the car started. </p>
<p>You should see your robot moving around the floor autonomously, avoiding obstacles anytime it gets within two inches of an object. Yay!</p>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/30-complete-robot.jpg" alt="30-complete-robot" class="wp-image-3589" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/30-complete-robot.jpg 600w, https://automaticaddison.com/wp-content/uploads/2019/11/30-complete-robot-300x225.jpg 300w" sizes="(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px"></figure></div>
<p>Now, open up your smartphone, and launch the Serial Bluetooth Terminal App. You should see the distance measurements (prefixed with “u “, which means ultrasonic sensor) being printed to your phone. </p>
<div class="wp-block-image"><figure class="aligncenter size-large"><img src="./How to Make an Autonomous Wheeled Robot Using ROS – Automatic Addison_files/21d-ble-data-flowing-485x1024.jpg" alt="21d-ble-data-flowing" class="wp-image-3573" srcset="https://automaticaddison.com/wp-content/uploads/2019/11/21d-ble-data-flowing-485x1024.jpg 485w, https://automaticaddison.com/wp-content/uploads/2019/11/21d-ble-data-flowing-142x300.jpg 142w, https://automaticaddison.com/wp-content/uploads/2019/11/21d-ble-data-flowing.jpg 600w" sizes="(max-width: 485px) 85vw, 485px"></figure></div>
<p>Whew! That was a lot of work. We are not done yet, but we have come a long way so far. </p>
<p><strong><a href="https://automaticaddison.com/how-to-make-an-autonomous-wheeled-robot-using-ros/#top">Return to Table of Contents</a></strong></p>