tag:blogger.com,1999:blog-7037257599505086172024-03-12T20:36:29.415-07:00BlockDuinoVasyl Yudinhttp://www.blogger.com/profile/05599352575777495536noreply@blogger.comBlogger55125tag:blogger.com,1999:blog-703725759950508617.post-71320156718224882352017-08-25T01:49:00.000-07:002017-09-18T21:35:10.303-07:00Ёлка шилд для ардуино - Xmas Tree Shield for Arduino<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="text-align: left;" trbidi="on">
Давным-давно, наверное года три назад, вдохновившись прикольным проектом "LoL Shield" и познакомившись с понятием <a href="https://ru.wikipedia.org/wiki/%D0%A7%D0%B0%D1%80%D0%BB%D0%B8%D0%BF%D0%BB%D0%B5%D0%BA%D1%81%D0%B8%D0%BD%D0%B3" target="_blank">Charlieplexing</a>, спроектировал к Новому Году платку в виде новогодней елки.<br />
Проектировал изначально под свой проект <a href="http://blockduino.org/" target="_blank">Blockduino</a>.<br />
<table><tbody>
<tr> <td><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpb02Y5yQPeGOzUMYXAhvJ1p2WBpf5yAOjFjcrLMYzbbMuDSX6GL2eA9TtmjpN1Ky4uI0NF9wEc12R6CLf3lD8l1oXjg2tRAp9eF-7yY049OwbWRh4awcMhiN7G0PZevmL20vQ0OzJ3afR/s1600/PlugYolka_schem_img.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="1307" data-original-width="1037" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpb02Y5yQPeGOzUMYXAhvJ1p2WBpf5yAOjFjcrLMYzbbMuDSX6GL2eA9TtmjpN1Ky4uI0NF9wEc12R6CLf3lD8l1oXjg2tRAp9eF-7yY049OwbWRh4awcMhiN7G0PZevmL20vQ0OzJ3afR/s320/PlugYolka_schem_img.png" width="253" /></a></td> <td><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjE-kO2jadCMAkewrJu0IO5i3XTttmoQL3vNCFy5ZfEhl0hYlltT8Eu86hShfcGhOfCKQNWGFWTv1R4bApMgCYaUe_Thy4D0gpY9FPl6ep95PskGSvqJ_ajwIsd5-Wu9vbMtoO46BVhwgRx/s1600/PlugYolka_schem_img.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="766" data-original-width="1600" height="191" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjE-kO2jadCMAkewrJu0IO5i3XTttmoQL3vNCFy5ZfEhl0hYlltT8Eu86hShfcGhOfCKQNWGFWTv1R4bApMgCYaUe_Thy4D0gpY9FPl6ep95PskGSvqJ_ajwIsd5-Wu9vbMtoO46BVhwgRx/s400/PlugYolka_schem_img.png" width="400" /></a></div>
<br /></td> </tr>
</tbody></table>
</div>
<div class="separator" style="clear: both; text-align: left;">
Т.е. как видно на схеме, установленны 72 светодиода которые управляются 7ю выводами микропроцессора: D2, D4-D8, D12.</div>
<div class="separator" style="clear: both; text-align: left;">
Получилось вот так вот:</div>
<br />
<table style="text-align: center;"><tbody>
<tr> <td><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjexIi8Z4Yej4BTuK_EKpfmVfLFyzRA2aUWy6lNKZnRUphSUp63im7LpOrOkUGr8TGuH0aDnQgbWNyAt-7L3W9zNt3EJj8puZQzHZPpvyc2WECrvjmC1312kFR3WBwi1PUx8Dow_qjTifKQ/s1600/20170825_101718.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1200" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjexIi8Z4Yej4BTuK_EKpfmVfLFyzRA2aUWy6lNKZnRUphSUp63im7LpOrOkUGr8TGuH0aDnQgbWNyAt-7L3W9zNt3EJj8puZQzHZPpvyc2WECrvjmC1312kFR3WBwi1PUx8Dow_qjTifKQ/s320/20170825_101718.jpg" width="240" /></a></td> <td><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjF2itxiVBA0El-eH1JLSU674FYEXKy7KXYQy_n7XLmbojHtRLwoF9l0kDHnKmPiqlQpOf9QRCuFjVLQfO0pHRJcIf4XK1gkGuhbuk2t1qxw265K6b9Qg6pfIaw_NLb5V235jDh_BwAxt5v/s1600/20170825_101728.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1201" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjF2itxiVBA0El-eH1JLSU674FYEXKy7KXYQy_n7XLmbojHtRLwoF9l0kDHnKmPiqlQpOf9QRCuFjVLQfO0pHRJcIf4XK1gkGuhbuk2t1qxw265K6b9Qg6pfIaw_NLb5V235jDh_BwAxt5v/s320/20170825_101728.jpg" width="240" /></a></td> </tr>
</tbody></table>
Вот первая проба пера на видео:<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/A851dlD84_A/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/A851dlD84_A?feature=player_embedded" width="320"></iframe></div>
Управляется с помощью переделанной библиотеки: <a href="https://github.com/jprodgers/LoLshield" target="_blank">LoLshield от jprodgers</a>. Может попозжее выложу.<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQsNKqOsOGxr4LR37kE4zktisZhCv7xi4v_IG8kgXdaKOoHfIYFlPRpi_rs0d1xs4ixgZOCk89NUDmNa02LSBtvU91SrGwccv3u7yHTs9f8y9apJuNPZtAmH3pFqs5uGRLF9lMtj-JnuZN/s1600/fail+led+schem.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="302" data-original-width="500" height="120" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQsNKqOsOGxr4LR37kE4zktisZhCv7xi4v_IG8kgXdaKOoHfIYFlPRpi_rs0d1xs4ixgZOCk89NUDmNa02LSBtvU91SrGwccv3u7yHTs9f8y9apJuNPZtAmH3pFqs5uGRLF9lMtj-JnuZN/s200/fail+led+schem.png" width="200" /></a>Как видно из видео, светодиоды можно использовать разного цвета, главное, чтобы их параметры были близки, к примеру впаяв в эту плату синий светодиод выяснил, что ток идет не через него, а через пару параллельных светодиодов зеленого цвета. Т.е. вот так как на схеме.<br />
Еще на плате можете увидеть место под RGB светодиод и три выводных резистора. Это я планировал сделать небольшую подсветку за платой-елкой, например набросать ваты, типа снежные сугробы, которые в темноте подсвечиваются плавно меняющимся цветом. Должно было бы быть красиво. Но мне не удалось подружить библиотеку Charlieplex c ШИМом, как бы работало, но заметно мерцало. В общем - оставил на потом.<br />
Вдоволь наигравшись решил, что идея хорошая и должна получить продолжение. В итоге переделал плату под стандартный разъем Ардуино, ну и заодно решил поэксперементировать и освоить пайку SMD светодиодов:<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<table style="text-align: center;"><tbody>
<tr> <td><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiiBY_qfApOpf4WRNbLi-V7j9UUdHPB8fP0BWYkDtvmqET4LEofCBDVYnhT1aur196uEMj1b5pmnDBZ1h59-U42CyKwu8X677Tbnu6IfA2TjQGLyRnHGe9fpSK0FHY6mc1-O2S7QejDz3P/s1600/20170825_101744.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1200" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiiBY_qfApOpf4WRNbLi-V7j9UUdHPB8fP0BWYkDtvmqET4LEofCBDVYnhT1aur196uEMj1b5pmnDBZ1h59-U42CyKwu8X677Tbnu6IfA2TjQGLyRnHGe9fpSK0FHY6mc1-O2S7QejDz3P/s320/20170825_101744.jpg" width="240" /></a></td> <td><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-Vm5eAy_bgkxDQqGBXis3XdpKdvRVujxCRGmIRFiwgNEKjhVHnonaCIQq0oOpk30mXQEPZ2KTVHaZ3vCeakM2FkJrfJq0X_OaX_HOiyA-_S9m8F5gZtZMlF_nSTuUciSUvPG6Cl0Uxa91/s1600/20170825_101755.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1200" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-Vm5eAy_bgkxDQqGBXis3XdpKdvRVujxCRGmIRFiwgNEKjhVHnonaCIQq0oOpk30mXQEPZ2KTVHaZ3vCeakM2FkJrfJq0X_OaX_HOiyA-_S9m8F5gZtZMlF_nSTuUciSUvPG6Cl0Uxa91/s320/20170825_101755.jpg" width="240" /></a></td> </tr>
</tbody></table>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/xgzdyq09A0Q/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/xgzdyq09A0Q?feature=player_embedded" width="320"></iframe></div>
<div class="separator" style="clear: both; text-align: left;">
Ну, пока на этом всё.</div>
<br />
Update: Видео работы уже третьей версии платы с установленными Arduino Mini Pro.<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe width="320" height="266" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/aq9ueNsnpeU/0.jpg" src="https://www.youtube.com/embed/aq9ueNsnpeU?feature=player_embedded" frameborder="0" allowfullscreen></iframe></div>
<br /></div>
Vasyl Yudinhttp://www.blogger.com/profile/05599352575777495536noreply@blogger.com1Svobody Square, 2, Kherson, Khersons'ka oblast, Ukraine46.640310257045108 32.61524319648742746.639628757045109 32.613982696487426 46.640991757045107 32.616503696487428tag:blogger.com,1999:blog-703725759950508617.post-43419942190851113812017-06-08T22:06:00.000-07:002017-06-18T09:07:02.052-07:00Glyphdicator - Ingress Glyph Indicator<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaOBTdYLI8ioFTKuc4hX-2N-nISfgsG-FAmFAL-skgQ-3j0lk1wHYkr-BGOYhsUCgEG274DzplSp_DXB0i26HoIzxKvBc7jRAoXaz_pTruO3dUPrtyu_OHd5o-BOrKLLLBdeZQrbTu7v8r/s1600/%25D0%2595Title.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="503" data-original-width="1600" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaOBTdYLI8ioFTKuc4hX-2N-nISfgsG-FAmFAL-skgQ-3j0lk1wHYkr-BGOYhsUCgEG274DzplSp_DXB0i26HoIzxKvBc7jRAoXaz_pTruO3dUPrtyu_OHd5o-BOrKLLLBdeZQrbTu7v8r/s640/%25D0%2595Title.jpg" width="640" /></a></div>
<h3 style="text-align: left;">
Вводная</h3>
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifUBToz1vgTkryNAQyY1gRHSGNsx9dK1sHgx0_QrIPIGFJjyP2DxMcFLQpCfkuAiSxc4_a0Uor5OgJRss0t4MbOvk8xMHgXSKoe7Pd2jnPH-2_kvNrHQ40t9cAQE880cTNbN1ZDkNmcaq6/s1600/Yolka-Sontse-Glyphdicator.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" data-original-height="740" data-original-width="1600" height="183" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifUBToz1vgTkryNAQyY1gRHSGNsx9dK1sHgx0_QrIPIGFJjyP2DxMcFLQpCfkuAiSxc4_a0Uor5OgJRss0t4MbOvk8xMHgXSKoe7Pd2jnPH-2_kvNrHQ40t9cAQE880cTNbN1ZDkNmcaq6/s400/Yolka-Sontse-Glyphdicator.jpg" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Yolka - 42 светодиода, Sontse - 126 светодиодов, IngressGlyphs - 132 светодиода</td></tr>
</tbody></table>
Расскажу как я чуток, чем занимаюсь последнее время (т.е. почему заглох блог )))<br />
Вот увлекся немного созданием плат с кучей светодиодов, по аналогу с LoLShield.<br />
Серию назвал ArduinoFun, fun переводится как забава, веселье, потеха. Т.е. для меня это баловство с ардуино.<br />
Сейчас расскажу о последней плате IngressGlyphs.<br />
<a name='more'></a><br />
<h3 style="text-align: left;">
Плата IngressGlyphs</h3>
Т.к. я давно учавствую в игре <a href="https://ru.wikipedia.org/wiki/Ingress" target="_blank">Ingress</a>, то... То что? Просто захотелось сделать что-то для её еще большего вывода в физический мир.<br />
Немного о плате:<br />
<br />
<ul style="text-align: left;">
<li>размер платы 100x80 мм;</li>
<li>состав платы: 132 светодиода типа 1206; пару разъёмов; плата Arduino;</li>
<li>Arduino можно использовать либо стандартного размера (UNO) или мини (ARDUINO-PRO-MINI-5.0V#APC);</li>
<li>цвет светодиодов любой, в идеале все одинаковые, можно комбинировать, но только если параметры диодов близки;</li>
<li>из Arduino задействованы 12 портов: D2-D13;</li>
<li>используется принцип <a href="https://ru.wikipedia.org/wiki/%D0%A7%D0%B0%D1%80%D0%BB%D0%B8%D0%BF%D0%BB%D0%B5%D0%BA%D1%81%D0%B8%D0%BD%D0%B3">чарлиплексинг</a>;</li>
</ul>
<br />
Что умеет плата:<br />
<div style="text-align: left;">
</div>
<ul style="text-align: left;">
<li>каждый светодиод управляется индивидуально и имеет 8 степеней яркости;</li>
<li>отображает любой глиф, например "ShowGlyphs(DISCOVER, PATH, CREATE, NEW, JOURNEY, 500);" последовательно покажет эти глифы;</li>
<li>отображает текст, например "char myStr[] = "Don't follow me I'm lost too"; Ticker(myStr, sizeof(myStr));" будет выводить последовательно условно читабельные <a href="http://tanukifont.com/ingress-glyphabet/">символы</a>;</li>
<li>знает символы от ' '(пробел) до '}'; кирилицы нет, пробовал - муторно получается;</li>
</ul>
<br />
<h3 style="text-align: left;">
Glyphdicator</h3>
Так как в моем городе должен был пройти <a href="http://missionday.od.ua/en/" target="_blank">МД</a> (игровой евент “Mission Day” (День Миссии)), то воодушевлённый этим событием решил поприветствовать гостей города чем-то этаким, ну в смысле поморгать им глифами.<br />
<br />
Для это были запаяны пять плат и собраны вот в такой вот девайс:<br />
<br />
Что умеет сей девайс:<br />
<br />
<ul style="text-align: left;">
<li>каждая плата имеет свой микропроцессор (клон Arduino Mini Pro);</li>
<li>первая плата - master, и управляет остальными платами (они - slave);</li>
<li>общение между платами по протоколу I2C (aka IIC, TWI);</li>
<li>в отличие от одиночной платы, те же команды работают на все платы, т.е. глифы выводятся так:</li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjh2_96ckuNtHk3V6Kz50Qrsk4qyY1kc6LToIKP2EKRIBc5kY6X58F5UFKdpcpsftKCZdo9aY0qdLEiiqFwxqRKSoi2T7-0QX4e_6TzrDpEMmDxNcMS93Wf-RTDi73DySWbz2d1ejEJ0Bu5/s1600/ezgif.com-crop.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="359" data-original-width="640" height="356" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjh2_96ckuNtHk3V6Kz50Qrsk4qyY1kc6LToIKP2EKRIBc5kY6X58F5UFKdpcpsftKCZdo9aY0qdLEiiqFwxqRKSoi2T7-0QX4e_6TzrDpEMmDxNcMS93Wf-RTDi73DySWbz2d1ejEJ0Bu5/s640/ezgif.com-crop.gif" width="640" /></a></div>
<br />
<br />
<ul style="text-align: left;">
<li>текст выводится в виде бегущей строки:</li>
</ul>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyugKpZTs1NwRujJpwp1cLWMoWyTy-bzRPERM-1z-dnoOiMZxhkUWvmZ-UW2dI_qMOCaiId688hM2p-Y7N43jtB6ZQmJQSaHHp1N7P_euUQwhHeDszpughYM-7TD-yJYh81JWY9wxwSHUz/s1600/ezgif.com-crop+text.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="359" data-original-width="640" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyugKpZTs1NwRujJpwp1cLWMoWyTy-bzRPERM-1z-dnoOiMZxhkUWvmZ-UW2dI_qMOCaiId688hM2p-Y7N43jtB6ZQmJQSaHHp1N7P_euUQwhHeDszpughYM-7TD-yJYh81JWY9wxwSHUz/s640/ezgif.com-crop+text.gif" width="640" /></a></div>
<br />
<br />
<ul style="text-align: left;">
<li>ну и еще прикрутил плату с RTC и периодически вывожу время:</li>
</ul>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFYmfcoCdtva-kKY6wRRmOkwTB19qm8LZ7CsuYzxI2gtr00ZElEY0ST2CdRnPt8VPsYmA0eCJEG9XUrzrt_DN9SbhnG1vTR5Ji0w9vJjh4g8yZpEMo2YEoVWrFJw-tFCYZdWCZQDvkSqMY/s1600/ezgif.com-crop+time.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="359" data-original-width="640" height="359" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFYmfcoCdtva-kKY6wRRmOkwTB19qm8LZ7CsuYzxI2gtr00ZElEY0ST2CdRnPt8VPsYmA0eCJEG9XUrzrt_DN9SbhnG1vTR5Ji0w9vJjh4g8yZpEMo2YEoVWrFJw-tFCYZdWCZQDvkSqMY/s640/ezgif.com-crop+time.gif" width="640" /></a></div>
<br />
<br />
<ul style="text-align: left;">
<li>так же можно выводить кой-какую анимацию:</li>
</ul>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgM4PkgYdrsh-cwyg0r07KrFIts8DhMIdgUPX6Ms-APtaFQYn4C-FI3LgpMaHYDX0sPYrMe7e5Qmd8VNls3aUooHpXxjVBZ1RE374-C6l_pIUiTfBXD7dg1zB6K7NReAXeAM8x4TfKCRdkD/s1600/animation2.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="359" data-original-width="640" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgM4PkgYdrsh-cwyg0r07KrFIts8DhMIdgUPX6Ms-APtaFQYn4C-FI3LgpMaHYDX0sPYrMe7e5Qmd8VNls3aUooHpXxjVBZ1RE374-C6l_pIUiTfBXD7dg1zB6K7NReAXeAM8x4TfKCRdkD/s640/animation2.gif" width="640" /></a></div>
<br />
Ну и немножко видео со всеми пяти глифовыми комбинациями:<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/gE1zo7joW68/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/gE1zo7joW68?feature=player_embedded" width="640"></iframe></div>
<br />
<h3 style="text-align: left;">
Glyphdicator на Mission Day Odessa или "Почему мы его там не видели?"</h3>
Вот тут мой просчёт, ну как просчёт, налицо отсутствие коммуникации.<br />
Я ж основывался на моем опыте предыдущего МД, а там рега была в помещении темного бара, регали пару чел сидя за столами куда ломилась очередь. Вот там на столе или за спинами регов я и рассчитывал повесить девайс. Там бы все его увидели и ох... ох, мечта-мечта... На деле же орги все классно организовали и регало человек двадцать размазанных на улице по большой площади, в итоге не было очередей и не было одной видовой точки.<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJQ8z8lGXIWr3wm4ec31-9wnJHBgyue_YWnvD-ULwLpiBzi998G-R8rBj_L_8c9y1xXnmedIMFLE3xKKrdQmPXcrZ0Rqs7Q4TPZN70IW0h_P4m04r60yPh_EYnz8QuPO9KjqmK0MROLus2/s1600/Me+n+MD+Odessa+1.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="900" data-original-width="1600" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJQ8z8lGXIWr3wm4ec31-9wnJHBgyue_YWnvD-ULwLpiBzi998G-R8rBj_L_8c9y1xXnmedIMFLE3xKKrdQmPXcrZ0Rqs7Q4TPZN70IW0h_P4m04r60yPh_EYnz8QuPO9KjqmK0MROLus2/s640/Me+n+MD+Odessa+1.JPG" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Устанавливаю Glyphdicator на крышу авто</td></tr>
</tbody></table>
К тому же дело было ярким солнечным днём и не такие уж и яркие светодиоды где-то терялись.<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6pSkNrr1u3i-JOlmgTKuEqwXbAnrEwExQbH8VjFriQvcd4OaFz4p-lPgiNAlIStzrJmZTRhB904i9VJi7qA2_AOHe94iOeHmfsvLqGI57NitaZK4kHSHDO1tRq_2JU3IEJ457g4cZ9ma9/s1600/20170527_163026.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="900" data-original-width="1600" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6pSkNrr1u3i-JOlmgTKuEqwXbAnrEwExQbH8VjFriQvcd4OaFz4p-lPgiNAlIStzrJmZTRhB904i9VJi7qA2_AOHe94iOeHmfsvLqGI57NitaZK4kHSHDO1tRq_2JU3IEJ457g4cZ9ma9/s640/20170527_163026.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Таким его видели на финише. На фото смазанный переход от показа времени к глифам.</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrwT9h3sq13I4nRWDVmwQqF2cac-uQYRWXltm938FTmRZJWpB4FGC-8KjiZXNUIlMXtzkvADORpNmzHy2H-mjdVnCUQcE2x8ZKr7Wr7wQLeuh8xMdV2uIXrWdwFykSUkY2CmbJPLOiBP6T/s1600/%25D1%2580%25D1%258E%25D0%25BA%25D0%25B7%25D0%25B0%25D0%25BA.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1600" data-original-width="1284" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrwT9h3sq13I4nRWDVmwQqF2cac-uQYRWXltm938FTmRZJWpB4FGC-8KjiZXNUIlMXtzkvADORpNmzHy2H-mjdVnCUQcE2x8ZKr7Wr7wQLeuh8xMdV2uIXrWdwFykSUkY2CmbJPLOiBP6T/s400/%25D1%2580%25D1%258E%25D0%25BA%25D0%25B7%25D0%25B0%25D0%25BA.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">А это мой рюкзак на Mission Day</td></tr>
</tbody></table>
<br />
<h3 style="text-align: left;">
Это конечный продукт?</h3>
Сейчас мне в нём почти всё нравится, кроме пары мелких недочётов. Не нравится то, что хотя я сейчас могу за пару минут перебить программку и начать выводить совсем другой текст, комбинации глифов, нарисовать чё-нить, то кроме меня этого не сделает никто. А это не есть хорошо, если делиться этой платой еще с кем-то.<br />
Так что в планах передавать команды на отображение чего-либо с компьютера по кабелю (легко!), передавать команды с телефона по блютузу (тож не сложно, пару лет тому управлял так машинкой), управлять специально написанной прогой под андроид (хз как её писать).<br />
<h3 style="text-align: left;">
Интересные, может быть, факты</h3>
<br />
<ul style="text-align: left;">
<li>из 132 светодиодов 13 не используются, 11 планируются на подсветку "узлов" глифов, а еще два хз зачем, может будет один синий и один зеленый, для индикации фракции;</li>
<li>размер платы 100х80, потому что это максимальный размер в бесплатной CAD Eagle;</li>
<li>Glyphdicator - это потому что я особо не думал как этот девайс назвать и называл его "девайсом", но Mechanicuss назвал это индикатором глифов. Ну вроде норм.</li>
</ul>
<br />
<h3 style="text-align: left;">
Ссыль</h3>
Автор в Telegram: <a href="https://t.me/BuzoterM">@BuzoterM</a> <br />
Кое-какой прогресс я буду скидывать сюда: <a href="https://plus.google.com/collection/0Yf3NE">G+</a> <br />
Кой-какие фото взяты отсюда: <a href="https://goo.gl/photos/oJng9P7UmCEmVGnY7">MD Odessa 27.05.2017</a> <br />
Откуда вдохновлялся на шрифт: <a href="http://tanukifont.com/ingress-glyphabet/">Glyphabet</a> <br />
Откуда брал глифы и их комбинации: <a href="http://glyphtionary.com/">Glyphtionary</a> <a href="https://gm9.github.io/ingress-glyph-tools/example-glyph-sequences.html#">Ingress Glyph Tools</a></div>
<br /></div>
Vasyl Yudinhttp://www.blogger.com/profile/05599352575777495536noreply@blogger.com0Prymors'ka Street, Odesa, Odessa Oblast, Ukraine, 6500046.490097 30.74534870000002246.488730499999996 30.742827200000022 46.4914635 30.747870200000023tag:blogger.com,1999:blog-703725759950508617.post-55997915393398634632015-07-05T04:15:00.000-07:002015-07-05T17:27:34.650-07:00Адресная работа с несколькими датчиками температуры DS18B20 с выводом на графический дисплей - Contrlol Multiple 18b20 Arduino GLCD<div dir="ltr" style="text-align: left;" trbidi="on">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigRKD6VHRXuRiHZQmuvYgK56xyHjOz2a3fB0ppmALNZW__jX2NKwOw7cesNxITguyGQ8-D9N-XzwEPBzvyzywpTIZET4SwcooN2EYm6jb8_CTfsxoRUivZD_97ssd-hVBhw5GUtYEWiTLd/s1600/Conrlol_Multiple_18b20_Arduino+GLCD+%25282%2529.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="133" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigRKD6VHRXuRiHZQmuvYgK56xyHjOz2a3fB0ppmALNZW__jX2NKwOw7cesNxITguyGQ8-D9N-XzwEPBzvyzywpTIZET4SwcooN2EYm6jb8_CTfsxoRUivZD_97ssd-hVBhw5GUtYEWiTLd/s200/Conrlol_Multiple_18b20_Arduino+GLCD+%25282%2529.jpg" width="200" /></a>Когда-то я уже <a href="http://blockduino.blogspot.com/2012/12/ds18b20.html" target="_blank">отписывался </a>о работе с тремя датчиками температуры от компании Dallas 18B20. Но на одном из форумов снова встретил обсуждение работы 10 датчиков. Так вот там утверждалось, что десять датчиков будут опрашиваться по секунде на каждого, те десять секунд на все. Меня это слегка смутило, не помню я такого, поэтому решил перепроверить все вживую. Тем более, что в прошлый раз я не доработал до ума код, тк те датчики не привязывались по адресам к объектам, а выбирались наугад, по очереди.<br />
В общем поставил я 6 датчиков, хотел 9, но не нашел столько сходу. Так что пока только шесть. Но это не принципиально, код написал более менее универсальный, так что можно использовать под любое количество датчиков.<br />
<a name='more'></a>Для этого мне понадобилось:<br />
<ul style="text-align: left;">
<li>Blockduino - 1 шт</li>
<li>CleClo-18B20 - 6 шт (1 - с резистором, 5 - без резистора)</li>
<li>PlugDIO (mama) - 1 шт</li>
<li>Blockproto2 с запаяным GLCD (в будущем PlugGLCD) - 1 шт</li>
<li>Провода стандарта GVS - 6 шт</li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxtTJ40LHH6KmnviY8zY6rEw0UzjmtM4zRwLL5aRBQcmun2DK9ihGK9h94_GyFTrxE-aiilVBEMsiyFVx6_uCPoMeyDNpFUbIP6d2RyLbgtP0949Vk_fLfRLa1PhNLpQ_lvthAiWTXQHzP/s1600/Conrlol_Multiple_18b20_Arduino+GLCD+%25283%2529.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="425" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxtTJ40LHH6KmnviY8zY6rEw0UzjmtM4zRwLL5aRBQcmun2DK9ihGK9h94_GyFTrxE-aiilVBEMsiyFVx6_uCPoMeyDNpFUbIP6d2RyLbgtP0949Vk_fLfRLa1PhNLpQ_lvthAiWTXQHzP/s640/Conrlol_Multiple_18b20_Arduino+GLCD+%25283%2529.jpg" width="640" /></a></div>
Подключил последовательно датчики температуры в порт D10 (можно любой другой свободный). Самый первый (с конца ;) датчик должен быть с резистором, я слегка промазал, и у меня с резистором второй по счету, но ничего - и так работает.<br />
Первым делом запустил код из <a href="http://blockduino.blogspot.com/2012/12/ds18b20.html" target="_blank">предыдущего поста</a> и убедился, что видит все датчики, и что скорость считывания гораздо выше чем утверждалось на форуме.<br />
Затем немного модифицировал код - добавил вывод времени, чтобы увидеть и документально подтвердить скорость считывания и получил такой результат:<br />
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">Dallas Temperature IC Control Library Demo<br />
Locating devices...Found 6 devices.<br />
Parasite power is: OFF<br />
Device #0 - Address: 28140758030000E8 Resolution: 9<br />
Device #1 - Address: 2882DB3C020000A1 Resolution: 9<br />
Device #2 - Address: 2822E85803000002 Resolution: 9<br />
Device #3 - Address: 288A2F6C060000FF Resolution: 9<br />
Device #4 - Address: 2853265F030000AB Resolution: 9<br />
Device #5 - Address: 28C7EC3C020000EA Resolution: 9<br />
Requesting temperatures...#0 DONE: 0:00:01<br />
Device Address: 28140758030000E8 Temp C: 22.50 Temp F: 72.50<br />
Device Address: 2882DB3C020000A1 Temp C: 23.00 Temp F: 73.40<br />
Device Address: 2822E85803000002 Temp C: 24.00 Temp F: 75.20<br />
Device Address: 288A2F6C060000FF Temp C: 23.00 Temp F: 73.40<br />
Device Address: 2853265F030000AB Temp C: 23.00 Temp F: 73.40<br />
Device Address: 28C7EC3C020000EA Temp C: 22.50 Temp F: 72.50<br />
Requesting temperatures...#1 DONE: 0:00:01<br />
Device Address: 28140758030000E8 Temp C: 22.50 Temp F: 72.50<br />
Device Address: 2882DB3C020000A1 Temp C: 23.00 Temp F: 73.40<br />
Device Address: 2822E85803000002 Temp C: 24.00 Temp F: 75.20<br />
Device Address: 288A2F6C060000FF Temp C: 23.00 Temp F: 73.40<br />
Device Address: 2853265F030000AB Temp C: 23.00 Temp F: 73.40<br />
Device Address: 28C7EC3C020000EA Temp C: 22.50 Temp F: 72.50<br />
Requesting temperatures...#2 DONE: 0:00:02<br />
<br />
...<br />
<br />
Requesting temperatures...#99 DONE: 0:00:52<br />
Device Address: 28140758030000E8 Temp C: 22.50 Temp F: 72.50<br />
Device Address: 2882DB3C020000A1 Temp C: 22.50 Temp F: 72.50<br />
Device Address: 2822E85803000002 Temp C: 23.50 Temp F: 74.30<br />
Device Address: 288A2F6C060000FF Temp C: 22.50 Temp F: 72.50<br />
Device Address: 2853265F030000AB Temp C: 22.50 Temp F: 72.50<br />
Device Address: 28C7EC3C020000EA Temp C: 22.50 Temp F: 72.50<br />
Requesting temperatures...#100 DONE: 0:00:53<br />
Device Address: 28140758030000E8 Temp C: 22.50 Temp F: 72.50<br />
Device Address: 2882DB3C020000A1 Temp C: 22.50 Temp F: 72.50<br />
Device Address: 2822E85803000002 Temp C: 23.50 Temp F: 74.30<br />
Device Address: 288A2F6C060000FF Temp C: 22.50 Temp F: 72.50<br />
Device Address: 2853265F030000AB Temp C: 22.50 Temp F: 72.50<br />
Device Address: 28C7EC3C020000EA Temp C: 22.50 Temp F: 72.50<br />
Requesting temperatures...#101 DONE: 0:00:54</span></blockquote>
<div style="text-align: left;">
Т.е. как видно, что сто считываний температуры с шести датчиков были выполнены за 52 секунды. Это при: <span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;">Resolution: 9,</span> а при 11, тоже будет уже за 0:01:21, т.е. за 80 секунд.<br />
<br />
Дальше, так как все уже собрано, решил вывести эти показания красиво на графический экран. Но, как и предполагал, столкнулся с проблемкой - датчики опрашиваются не последовательно по расположению, а в некотором зафиксированном, но случайном порядке. Ну в смысле, если я грею первый по счету датчик, а выводится он пятым в списке, второй - третьим, третий - шестым. Бардак вобщем.<br />
Чтоб избавиться от такой проблемки нужно опрашивать датчики не по порядку, а по адресу датчика. Напомню: каждый датчик имеет свой уникальный адрес, который вшит в его чип.<br />
А чтоб опрашивать по адресам, нужно их сначала считать и записать куда-нибудь.<br />
Для этого я написал код, который выдает в Serial список адресов в удобном к использованию формате. Для этого нужно (после загрузки кода ессно) дотрагиваться в нужной Вам последовательности к датчикам и код выдает такой текст:<br />
<blockquote class="tr_bq">
<br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">This sketch help find and print adresses of all 18B20 themperature sensors<br />
Sensors should be connected to port: 10<br />
Init<br />
Found 6 sensors<br />
Requiest temperatures...<br />
22.69 oC<br />
22.87 oC<br />
23.50 oC<br />
22.81 oC<br />
22.62 oC<br />
22.56 oC<br />
Ready to locate adresses.<br />
Touch sensors in sequinces to heat plus one degree<br />
<br />
DeviceAddress myAddress[] = {<br />
{0x28, 0x53, 0x26, 0x5F, 0x03, 0x00, 0x00, 0xAB},<br />
{0x28, 0xC7, 0xEC, 0x3C, 0x02, 0x00, 0x00, 0xEA},<br />
{0x28, 0x14, 0x07, 0x58, 0x03, 0x00, 0x00, 0xE8},<br />
{0x28, 0x22, 0xE8, 0x58, 0x03, 0x00, 0x00, 0x02},<br />
{0x28, 0x82, 0xDB, 0x3C, 0x02, 0x00, 0x00, 0xA1},<br />
{0x28, 0x8A, 0x2F, 0x6C, 0x06, 0x00, 0x00, 0xFF}<br />
};<br />
<br />
DONE!!!</span></blockquote>
Остается только скопировать сформированный массив (все от слова 'degree' до слова 'DONE!!!') и вставить в Ваш код.<br />
Вот код для поиска адресов и для вывода шести датчиков на графический дисплейчик.</div>
<h3 style="text-align: left;">
Код</h3>
<h4 style="text-align: left;">
Поиск и вывод адресов</h4>
<iframe allowtransparency="true" frameborder="0" src="https://codebender.cc/embed/sketch:130313" style="height: 510px; margin: 10px 0 10px; width: 100%;"></iframe><br />
<h4 style="text-align: left;">
Вывод шести датчиков температуры поадресно на графический экран</h4>
<iframe allowtransparency="true" frameborder="0" src="https://codebender.cc/embed/sketch:130300" style="height: 510px; margin: 10px 0 10px; width: 100%;"></iframe><br />
<h3 style="text-align: left;">
Фото</h3>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuVtUFnrOjeA_UQKe6SgyZx32G8YEUePCjweQacXcfaf1tB9kMppd3XuPjvopEsyxAlJNC6h0UhNK0EtAGXr5HD_mzu_pqf4j0wKk_63bXZ7AYSzHFm1fGQ3B1_x0Xk1_lLJw4oxPFVF5t/s1600/Conrlol_Multiple_18b20_Arduino+GLCD+%25281%2529.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="425" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuVtUFnrOjeA_UQKe6SgyZx32G8YEUePCjweQacXcfaf1tB9kMppd3XuPjvopEsyxAlJNC6h0UhNK0EtAGXr5HD_mzu_pqf4j0wKk_63bXZ7AYSzHFm1fGQ3B1_x0Xk1_lLJw4oxPFVF5t/s640/Conrlol_Multiple_18b20_Arduino+GLCD+%25281%2529.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Датчик температуры 18B20 - CleClo_18B20</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiah7c2P-UyGyTyZlixHf1z_JliI0VeE4-clp41s1U4pROh7uqqUjrGdAk2-rI4C5E3x5nwyfvxCKyPENLjXRGfWPusKLMGu8ye_ehAq2Z6fu83dUSY57kKWinrE-280HhB5x0ffyP3ePFq/s1600/Conrlol_Multiple_18b20_Arduino+GLCD+%25287%2529.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="425" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiah7c2P-UyGyTyZlixHf1z_JliI0VeE4-clp41s1U4pROh7uqqUjrGdAk2-rI4C5E3x5nwyfvxCKyPENLjXRGfWPusKLMGu8ye_ehAq2Z6fu83dUSY57kKWinrE-280HhB5x0ffyP3ePFq/s640/Conrlol_Multiple_18b20_Arduino+GLCD+%25287%2529.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Дотрагиваюсь до левого верхнего - там же и выводится</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZojC3vphjP2gOQTm35r3-NeSz7Og3j6VtD02K_O6-gU7LMjGMS6AC6E8AJ9wDCsQfTuiiCBRaMInf5_ucC_oiim_BoDc1KS5Fe1FWlCna2Yekc9besRi7-45Ip0shW_h9b7k6XPe477Xx/s1600/Conrlol_Multiple_18b20_Arduino+GLCD+%25286%2529.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto; text-align: center;"><img border="0" height="425" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZojC3vphjP2gOQTm35r3-NeSz7Og3j6VtD02K_O6-gU7LMjGMS6AC6E8AJ9wDCsQfTuiiCBRaMInf5_ucC_oiim_BoDc1KS5Fe1FWlCna2Yekc9besRi7-45Ip0shW_h9b7k6XPe477Xx/s640/Conrlol_Multiple_18b20_Arduino+GLCD+%25286%2529.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-size: 12.8000001907349px;">Дотрагиваюсь до правого нижнего - там же и выводится... Зашибись! :)</span></td></tr>
</tbody></table>
<div>
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzxcfQ8hPvJqw6PzKlBEcS-C3kXsXDAhDbuJA_wfxxpQzOs0k97h-V3BF4dCdvHqYx1ud-KTVqWzRALrWExl5-zKA63KWlUhyphenhyphenvHlyMFIqCSPxMVWFOqZ7ceLCBulEmlRX5cQKuzxEcLrQY/s1600/Conrlol_Multiple_18b20_Arduino+GLCD+%25288%2529.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto; text-align: center;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzxcfQ8hPvJqw6PzKlBEcS-C3kXsXDAhDbuJA_wfxxpQzOs0k97h-V3BF4dCdvHqYx1ud-KTVqWzRALrWExl5-zKA63KWlUhyphenhyphenvHlyMFIqCSPxMVWFOqZ7ceLCBulEmlRX5cQKuzxEcLrQY/s640/Conrlol_Multiple_18b20_Arduino+GLCD+%25288%2529.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Здесь был использован файл с русским шрифтом SystemRus5x7.h взятый на mk90.ru</td></tr>
</tbody></table>
</div>
Vasyl Yudinhttp://www.blogger.com/profile/05599352575777495536noreply@blogger.com1tag:blogger.com,1999:blog-703725759950508617.post-40446453192311620462015-06-28T17:44:00.001-07:002015-07-21T12:05:20.975-07:00Велосипедный спидометр с графическим ЖК дисплеем 128х64 и библиотекой openGLCD - Bike Speedometer GLCD 128x64 openGLCD lib<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSL5uDVrmbhxpYdmF1fzkYhwJozn1E4DIieaUm-CM6W8Q92cZccjRc-xWWAh71FaV4w2OLwib3P_5qhqBAvO_7YKh2rTIy3iaXsJt9fCFhjQODAZ0ugXR2rk_5bBHpYAFhzvwzrjo2jJME/s1600/Bike_Speedometer_GLCD_128x64+%25281%2529.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="133" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSL5uDVrmbhxpYdmF1fzkYhwJozn1E4DIieaUm-CM6W8Q92cZccjRc-xWWAh71FaV4w2OLwib3P_5qhqBAvO_7YKh2rTIy3iaXsJt9fCFhjQODAZ0ugXR2rk_5bBHpYAFhzvwzrjo2jJME/s200/Bike_Speedometer_GLCD_128x64+%25281%2529.jpg" width="200" /></a></div>
Продолжаю играться в велосипедные спидометры.<br />
На этот раз подключил графический ЖК дисплейчик с разрешением 128 на 64 точки. Припаял его на BlockProto2, довольно неплохо он там умостился.<br />
Сюда уже можно вывести много информации, поэтому вывожу:<br />
<ul style="text-align: left;">
<li>Скорость (Speed) - большими и красивыми цифрами, шрифт сделал сам с помощью проги из библиотеки, прилагается к коду отдельным файлом;</li>
<li>Общий пробег (Distance) - до 999.99 км</li>
<li>Общее время (TripTime) от включения спидометра</li>
<li>График скорости - по вертикали скорость от 0 до 30 км/ч, по горизонтали - время от 0 до 60 секунд. График не движется, а прорисовывается слева на право.<br />
<a name='more'></a></li>
</ul>
<h3 style="text-align: left;">
Фото:</h3>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHVdLYnzEU0nEJAsZA3TQJBdf0BwG_QYhxRuMCZJ9aEPuI7S0jEHHACCz5Zr44xVPZDnF_hi7VDK2VAYexN6RKOMJY3vWHVPNK-7DzWF29DX246dtICilfHCnjN4ASKZX99iNiS9adHJXR/s1600/Bike_Speedometer_GLCD_128x64+%25283%2529.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Speedometer/odometer on arduino with GLCD 12864 and openGLCD lib" border="0" height="356" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHVdLYnzEU0nEJAsZA3TQJBdf0BwG_QYhxRuMCZJ9aEPuI7S0jEHHACCz5Zr44xVPZDnF_hi7VDK2VAYexN6RKOMJY3vWHVPNK-7DzWF29DX246dtICilfHCnjN4ASKZX99iNiS9adHJXR/s640/Bike_Speedometer_GLCD_128x64+%25283%2529.jpg" title="Вывод инфо со спидометра на Arduino на графический ЖК дисплей" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPaVdhkXlMU9an6xLTTJeOiYGVwXYe3FMFzC0INTkrN93knBIbgiFY8zM4XI1Euy5QhkKzjQeJWDAurOalvITFjI8U0WV9nI6RKcrDHyy-l6bQCMLWgSLqPR5qnkUa7JL2R6Vpe9oQTnO1/s1600/Bike_Speedometer_GLCD_128x64+%25282%2529.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Speedometer/odometer on arduino with GLCD 12864 and openGLCD lib" border="0" height="425" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPaVdhkXlMU9an6xLTTJeOiYGVwXYe3FMFzC0INTkrN93knBIbgiFY8zM4XI1Euy5QhkKzjQeJWDAurOalvITFjI8U0WV9nI6RKcrDHyy-l6bQCMLWgSLqPR5qnkUa7JL2R6Vpe9oQTnO1/s640/Bike_Speedometer_GLCD_128x64+%25282%2529.jpg" title="GLCD запаянный на BlockProto2 - Велосипедный спидометр с графическим выводом на ардуино" width="640" /></a></div>
<br />
<h3 style="text-align: left;">
Код:</h3>
<iframe allowtransparency="true" frameborder="0" src="https://codebender.cc/embed/sketch:128853" style="height: 510px; margin: 10px 0 10px; width: 100%;"></iframe><br />
<h3 style="text-align: left;">
Что дальше?</h3>
<div>
Ну, еще я вроде как собирался подключить компас и выводить направление, может еще температуру и еще чё нить типа gps. Но подумалось мне, что чем цеплять побольше экран и кучу датчиков, то гораздо лучше уже просто повесить небольшой смартфон, а они сейчас недорого стоят, по крайней мере старые модели, и к нему подключить датчик и ним же производить все расчеты и выводить кучу полезной инфы.</div>
<div>
Вобщем, для меня тема спидометра раскрыта и закрыта ;)</div>
<h3 style="text-align: left;">
Предыдущие спидометры</h3>
<div>
<ul style="text-align: left;">
<li><a href="http://blockduino.blogspot.ca/2015/06/164-bigcrystal-bike-speedometer-lcd.html" target="">Велосипедный спидометр с ЖК дисплеем 16х4 и библиотекой BigCrystal</a></li>
<li><a href="http://blockduino.blogspot.ca/2015/06/bike-speedometer-lcd0802.html">Велосипедный спидометр с ЖК дисплеем LCD0802</a><br />
</li>
<li><a href="http://blockduino.blogspot.com/2015/06/bike-speedometer-7segment-display.html">Велосипедный спидометр на семисегментном индикаторе</a></li>
</ul>
<br />
<br /></div>
</div>
Vasyl Yudinhttp://www.blogger.com/profile/05599352575777495536noreply@blogger.com0tag:blogger.com,1999:blog-703725759950508617.post-23342057388409912752015-06-23T03:21:00.002-07:002015-07-21T12:05:20.972-07:00Велосипедный спидометр с ЖК дисплеем 16х4 и библиотекой BigCrystal - Bike Speedometer LCD JM164 BigCrystal lib<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvC09jlxsjYI4LQDHil1N4VLQHCIJYe8SJSI2MEs1CVG1X_KrUet0eSrYfqIO1eVsbNCPc5xXZrmabyF6-aUPotPjQe5gRo4nJigHRsELYwfc0MqGku5tme8XhVlNwyFotVzhmsqoQPYmc/s1600/1-20150620_211230_LLS.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="133" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvC09jlxsjYI4LQDHil1N4VLQHCIJYe8SJSI2MEs1CVG1X_KrUet0eSrYfqIO1eVsbNCPc5xXZrmabyF6-aUPotPjQe5gRo4nJigHRsELYwfc0MqGku5tme8XhVlNwyFotVzhmsqoQPYmc/s200/1-20150620_211230_LLS.jpg" width="200" /></a></div>
Продолжаю играться в велосипедные спидометры.<br />
На этот раз подключил ЖК дисплейчик JM164A, т.е. 16 символов в 4 ряда. Что немножко избыточно для вывода скорости и расстояния. Но можно подключить библиотеку <a href="https://github.com/gregington/BigCrystal" target="_blank">BigCristal</a> для вывода больших цифр.<br />
Правда нормального вывода чисел там нет, а только посимвольно, поэтому пришлось немного допилить библиотеку, чтоб можно было пользоваться просто функцией Print().<br />
<a name='more'></a><br />
<strike>Так что хотя код я и выложу, воспользоваться пока ним не получится, по крайней мере пока я не скину переделанную библиотеку в сеть.</strike><br />
<b>Update: </b>Переделанную библиотеку можно скачать здесь: <a href="https://github.com/BlockThor/BigCrystal">https://github.com/BlockThor/BigCrystal</a><br />
<h3 style="text-align: left;">
Фото</h3>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIagzJ5yFlu4oCKyi_IjZnoVWVPRdQHZbicIFUBTjPr-1ua8kX_QGDOSwvjxLpq27yzmWPji6Kr-wAbXaL8kzko3gRJh1w9VUqo163N5C1OqSfcGyWGM8fbzSnGo3tyX9zVaMB-rpQUDGA/s1600/3-20150620_095948.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="BigCrystal lib on JM164A" border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIagzJ5yFlu4oCKyi_IjZnoVWVPRdQHZbicIFUBTjPr-1ua8kX_QGDOSwvjxLpq27yzmWPji6Kr-wAbXaL8kzko3gRJh1w9VUqo163N5C1OqSfcGyWGM8fbzSnGo3tyX9zVaMB-rpQUDGA/s640/3-20150620_095948.jpg" title="BigCrystal lib on JM164A" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Работа библиотеки BigCrystal</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgApC-egbm0u9pzh3lJwfDLQRYmo3CNtFUyTfTuKCQHMHZmd49351tCNKGchnkNGPPjzxESRmzmyb7iS6kthW4z7z89fUTZc_FPXwUZKDtBEPMHAh41eR1CAsiwljYxiQXaqYOUmOXw6TNJ/s1600/2-20150620_211218_LLS.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto; text-align: center;"><img alt="Bike speedometer with BigCrystal lib on JM164A with Print()" border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgApC-egbm0u9pzh3lJwfDLQRYmo3CNtFUyTfTuKCQHMHZmd49351tCNKGchnkNGPPjzxESRmzmyb7iS6kthW4z7z89fUTZc_FPXwUZKDtBEPMHAh41eR1CAsiwljYxiQXaqYOUmOXw6TNJ/s640/2-20150620_211218_LLS.jpg" title="Bike speedometer with BigCrystal lib on JM164A with Print()" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Вывод инфо на JM164A с библиотекой BigCrystal<br />
Вверху слева - скорость, внизу справа - пройденное расстояние.</td></tr>
</tbody></table>
<h3 style="text-align: left;">
Код</h3>
<iframe allowtransparency="true" frameborder="0" src="https://codebender.cc/embed/sketch:127025" style="height: 510px; margin: 10px 0 10px; width: 100%;"></iframe>></div>
Vasyl Yudinhttp://www.blogger.com/profile/05599352575777495536noreply@blogger.com1tag:blogger.com,1999:blog-703725759950508617.post-15695320008490639932015-06-08T03:36:00.000-07:002015-07-21T12:05:20.969-07:00Велосипедный спидометр с ЖК дисплеем - Bike Speedometer LCD0802<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOi-Z1zuva0ihQ7_g8VnjhjzE0skJAHyfPQHeM65fb4MLpdJtVveNdDtuMGtt8M9INpMgwDVQGJX7UOWbq9hgFWJfcqaDq5ukm_HfCkYcc0Sjk8-Nba8yO6uDQ12ir7rcRgQKR1V0HlpPZ/s1600/Bike_Speedometer_LCD0802_IC+%25282%2529.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="133" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOi-Z1zuva0ihQ7_g8VnjhjzE0skJAHyfPQHeM65fb4MLpdJtVveNdDtuMGtt8M9INpMgwDVQGJX7UOWbq9hgFWJfcqaDq5ukm_HfCkYcc0Sjk8-Nba8yO6uDQ12ir7rcRgQKR1V0HlpPZ/s200/Bike_Speedometer_LCD0802_IC+%25282%2529.jpg" width="200" /></a></div>
При компоновке велоспидометра для <a href="http://blockduino.blogspot.com/2015/06/bike-speedometer-7segment-display.html" target="_blank">предыдущего поста</a>, сразу было понятно, что ставить семисегментный индикатор для вывода скорости не совсем то что надо - информативность низкая: пройденное расстояние некуда уже выводить, видимость тоже не ахти: днем не видно, ночью глаза слепит. Но таким было техзадание.<br />
Поэтому когда отполировал код, сразу же подключил ЖК дисплейчик. Вернее платку с <a href="http://blockduino.org/mediawiki/index.php?title=BlockLCD0802_IC" target="_blank">BlockLCD0802_IC</a>, т.е. дисплей с разрешением 8 символов в 2 строки с управлением по протоколу I2C (он же TWI).<br />
Теперь видимость уже получше, да и больше инфо можно вывести<br />
<a name='more'></a><h3 style="text-align: left;">
Фото</h3>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidK_PwueDpz_isZeF6QFQb4fRrX6GzFOSwlP9CAGD8D_neSUAwksd-KaHe93y_r0Y0aTkXSD9gqc-eeyL8cHxLmiULdMPDZkcUbBIEd5kt0OtQN20OG6Tl2Q1-1yX1VBNj1puFxQxajykv/s1600/Bike_Speedometer_LCD0802_IC+%25281%2529.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidK_PwueDpz_isZeF6QFQb4fRrX6GzFOSwlP9CAGD8D_neSUAwksd-KaHe93y_r0Y0aTkXSD9gqc-eeyL8cHxLmiULdMPDZkcUbBIEd5kt0OtQN20OG6Tl2Q1-1yX1VBNj1puFxQxajykv/s400/Bike_Speedometer_LCD0802_IC+%25281%2529.jpg" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">При запуске - подсказка</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbK_NngbuzYTICegtOAesteyolejnkUSiNVo6-v61_9nzAYlTMbiaU_DTW4O8X9eW_YebDIkqvy0rzosnpxBGTWiRJkI91VfCYAtCfwCO1VIY8w0kbkjGnnmoQXQ6TFwGigS-qhxIag5I-/s1600/Bike_Speedometer_LCD0802_IC+%25283%2529.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="266" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbK_NngbuzYTICegtOAesteyolejnkUSiNVo6-v61_9nzAYlTMbiaU_DTW4O8X9eW_YebDIkqvy0rzosnpxBGTWiRJkI91VfCYAtCfwCO1VIY8w0kbkjGnnmoQXQ6TFwGigS-qhxIag5I-/s400/Bike_Speedometer_LCD0802_IC+%25283%2529.jpg" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Во время работы</td></tr>
</tbody></table>
<h3 style="text-align: left;">
Код</h3>
<iframe allowtransparency="true" frameborder="0" src="https://codebender.cc/embed/sketch:123850" style="height: 510px; margin: 10px 0 10px; width: 100%;"></iframe><br /></div>
Vasyl Yudinhttp://www.blogger.com/profile/05599352575777495536noreply@blogger.com0tag:blogger.com,1999:blog-703725759950508617.post-59115430083758408662015-06-07T03:59:00.000-07:002015-07-21T12:05:20.979-07:00Велосипедный спидометр на семисегментном индикаторе - Bike Speedometer 7Segment Display<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0TZ4szh9U-RVGCxZDDBMRnhBMy4NUYuQsLwuSPCqQDP0V8azvDNyeT4Ud61d8m1oWG1Ir4IO6htcHHY5M8evmB-ec2MN_Kb4laEow4vJRBjSQC_5Rcy2MPW0mDiQZt1mTpjtDzNnkdUQS/s1600/3-20150604_225030.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="133" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0TZ4szh9U-RVGCxZDDBMRnhBMy4NUYuQsLwuSPCqQDP0V8azvDNyeT4Ud61d8m1oWG1Ir4IO6htcHHY5M8evmB-ec2MN_Kb4laEow4vJRBjSQC_5Rcy2MPW0mDiQZt1mTpjtDzNnkdUQS/s200/3-20150604_225030.jpg" width="200" /></a></div>
Привлекла мое внимание ветка на форуме <a href="http://arduino.ru/forum/programmirovanie/velospidometr" target="_blank">Arduino.ru</a> о создании велосипедного спидометра с выводом на семисегментный индикатор.<br />
<div>
Захотелось и себе попробовать, ведь все компоненты для этого уже есть под рукой, да и в перспективе планирую прикупить велосипед.</div>
<div>
Для спидометра мне понадобились:</div>
<div>
<ul style="text-align: left;">
<li><a href="http://blockduino.org/mediawiki/index.php?title=BlockDuino" target="_blank">Blockduino</a></li>
<li><a href="http://blockduino.org/mediawiki/index.php?title=Block7Seg" target="_blank">Block7Seg</a></li>
<li><a href="http://blockduino.org/mediawiki/index.php?title=LED" target="_blank">CleCloLED</a></li>
<li><a href="http://blockduino.org/mediawiki/index.php?title=ReedSwitch" target="_blank">CleCloReed</a></li>
<li>два трехжильных кабеля</li>
<li>магнит</li>
<li>имитация колеса (у меня это вентилятор от компа)</li>
</ul>
<div>
<a name='more'></a><br />
Принцип действия прост: магнит цепляется на колесе на спицу, а геркон на раму, между колесом и рамой.<br />
Магнит пролетая рядом с герконом замыкает его, а программа замеряет время между двумя замыканиями и рассчитывает скорость велосипеда.<br />
Для этого в программу нужно забить радиус колеса в метрах, зная радиус мы можем рассчитать периметр колеса, т.е. расстояние которое колесо проходит за один оборот (оно равно произведению двух пи на радиус колеса).</div>
</div>
<h3 style="text-align: left;">
Фото:</h3>
<table align="center" border="0" style="width: 100%px;"><tbody>
<tr> <td><div style="text-align: center;">
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyFx-0gxphxjtJWvqLObMj9Cs-Ih0TrsaqwD-qerEm4bcm4aCJVu4kcEW_CIEbBjfuVy8LAbPQsY0woV9gYQaOKNjFuFPkbtA-yMK1Q5UveHW_S3vEZY2vl9te7N4m03VR3yDOh9R4OzON/s1600/1-20150604_224854.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="213" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyFx-0gxphxjtJWvqLObMj9Cs-Ih0TrsaqwD-qerEm4bcm4aCJVu4kcEW_CIEbBjfuVy8LAbPQsY0woV9gYQaOKNjFuFPkbtA-yMK1Q5UveHW_S3vEZY2vl9te7N4m03VR3yDOh9R4OzON/s320/1-20150604_224854.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">"Имитатор колеса" сдвинут</td></tr>
</tbody></table>
</div>
</td> <td><div style="text-align: center;">
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjp6NPch7b2SkbtaBTPDav4zx-ohbo0kQ22j3jQddwH25YXIBah2Q0m_QOS3zpHMxZo9fI6HQIWDJfpolO028cfHcukh_L3CgncyKlCc_wrXXimLnt8zy2y_zAAxImCsfVpxpPQGNFCooOl/s1600/2-20150604_224911.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="213" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjp6NPch7b2SkbtaBTPDav4zx-ohbo0kQ22j3jQddwH25YXIBah2Q0m_QOS3zpHMxZo9fI6HQIWDJfpolO028cfHcukh_L3CgncyKlCc_wrXXimLnt8zy2y_zAAxImCsfVpxpPQGNFCooOl/s320/2-20150604_224911.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Крупным планом - геркон</td></tr>
</tbody></table>
</div>
</td> </tr>
<tr> <td><div style="text-align: center;">
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsIcmbgr7lenxXHBdB6W1-DaBafMNaZcnBY1hrn8f11Z48augvS6i8VI1WPF4a36n-qq41KCdU4soS7v-VG_UEiOH2Iy2jf0ZVuamBOqxlgQ8coAksbxWPebwsvAmEHSVpqxL6hs5AssVb/s1600/4-20150604_225138.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="213" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsIcmbgr7lenxXHBdB6W1-DaBafMNaZcnBY1hrn8f11Z48augvS6i8VI1WPF4a36n-qq41KCdU4soS7v-VG_UEiOH2Iy2jf0ZVuamBOqxlgQ8coAksbxWPebwsvAmEHSVpqxL6hs5AssVb/s320/4-20150604_225138.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Пусть вас не смущает скорость в 60 км/час, все верно</td></tr>
</tbody></table>
</div>
</td> <td><div style="text-align: center;">
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyN_6MQ2p9KTIRNJioN6bx4r3oY4rgJshdVnZ9OzTRzDQPSgLUIwPhK7jpwlWPW_8pqm-la8liLInJwu7HJ3Z1darkMZGnzMSVVvzrZVg4N5glFkPJGNZIVVmr4QAa4zirwl0Dzb6H_K-s/s1600/5-20150604_225354.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="213" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyN_6MQ2p9KTIRNJioN6bx4r3oY4rgJshdVnZ9OzTRzDQPSgLUIwPhK7jpwlWPW_8pqm-la8liLInJwu7HJ3Z1darkMZGnzMSVVvzrZVg4N5glFkPJGNZIVVmr4QAa4zirwl0Dzb6H_K-s/s320/5-20150604_225354.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">С зеленым светофильтром более читабельно</td></tr>
</tbody></table>
</div>
</td></tr>
</tbody></table>
<h3 style="text-align: left;">
Код:</h3>
<iframe allowtransparency="true" frameborder="0" src="https://codebender.cc/embed/sketch:121486" style="height: 510px; margin: 10px 0 10px; width: 100%;"></iframe><br />
<h3 style="text-align: left;">
Вместо видео:</h3>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLp8diH39R7pT6K37G90UoD1WHG68lzV_3BEcybNXH17RB-yWh3TiwipiguDUlcVfpMtOKXE8dcvdLjV7bMYGgQPdz07SnbldQ_aaUktDGq4Fpf0VQ5MhJN5H7Xj-r0pttNl0Du9yRbMN5/s1600/20150604_225451.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLp8diH39R7pT6K37G90UoD1WHG68lzV_3BEcybNXH17RB-yWh3TiwipiguDUlcVfpMtOKXE8dcvdLjV7bMYGgQPdz07SnbldQ_aaUktDGq4Fpf0VQ5MhJN5H7Xj-r0pttNl0Du9yRbMN5/s320/20150604_225451.gif" width="320" /></a></div>
<br /></div>
Vasyl Yudinhttp://www.blogger.com/profile/05599352575777495536noreply@blogger.com0tag:blogger.com,1999:blog-703725759950508617.post-62478701332708898562015-06-05T05:01:00.000-07:002015-06-09T02:30:25.522-07:00Тотальное обновление библиотеки lib_Block7Seg, она же PrintTo7Seg<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlmKyLspnQDGk8kYxNN04k9nnMAax3-m3BRRhNvI6WlJpvUk0Rr5emPvU4xtgnqwTni8e_Iwq2kQWUm2zQ4tc16KDBUZVWGqn1VM7xa6bYB1U25jlmE9M9g7sIoauK0N9ce9qZ7OjAHi69/s1600/Block7Seg-print.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em; text-align: center;"><img border="0" height="150" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlmKyLspnQDGk8kYxNN04k9nnMAax3-m3BRRhNvI6WlJpvUk0Rr5emPvU4xtgnqwTni8e_Iwq2kQWUm2zQ4tc16KDBUZVWGqn1VM7xa6bYB1U25jlmE9M9g7sIoauK0N9ce9qZ7OjAHi69/s1600/Block7Seg-print.jpg" width="200" /></a></div>
Еще на стадии написания библиотеки под блок для <a href="http://blockduino.blogspot.com/2014/04/block7seg.html" target="_blank">семисегментрого дисплея</a> я понял, что выбрал не совсем правильный алгоритм, там информация в памяти хранится в виде выводимого текста, а в матрицу данных на светодиоды преобразуется каждый раз на лету при выводе на дисплей.<br />
Во-первых, это затраты по времени, а во-вторых (что для меня важно) это не позволяло управлять отдельно любым светодиодом на дисплее, т.е. не давало возможности создавать кастомные символы и выводить какую-нибудь анимацию.<br />
Но при написании библиотеки под <a href="http://blockduino.blogspot.com/2015/04/block7segic-print.html" target="_blank">Block7Seg_IC</a> я уже подошел по другому, а заодно и переделал библиотеку для <a href="http://blockduino.blogspot.com/2014/04/block7seg.html" target="_blank">Block7Seg</a>. Теперь в памяти хранится уже матрица данных на светодиоды.<br />
<a name='more'></a>Что дает возможность изменять состояние любого из них.<br />
Добавил пару новых функций, но совместимость с предыдущей версией оставил.<br />
<h4 style="text-align: left;">
Список функций:</h4>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace;">setLed(location, led, state);<br />
setDot(location, state);<br />
setDigit(location, data);<br />
getDigit(location);<br />
setCursor(location);<br />
autoscroll(void);<br />
noAutoscroll(void);<br />
clear(void);<br />
home(void);<br />
scrollDisplayLeft(void);<br />
scrollDisplayRight(void);</span></blockquote>
Ну и конечно же функция <span style="font-family: Courier New, Courier, monospace;">Print()</span>.<br />
<h4 style="text-align: left;">
PrintTo7Seg</h4>
<div>
Так же сделал дубль этой библиотеки но уже под другим именем и с возможностью задавать пины подключения дисплея в самой программе, а не в библиотеке.</div>
<div>
Т.е. здесь вместо простого объявления переменной:</div>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace;">Block7Seg Seg7(COMMON_CATHODE);</span></blockquote>
<div>
Нужно писать:</div>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace;">
byte numOfDigits = 4;<br />
// digitPins - LSB to MSB<br />
byte digPins[] = {3, 7, 8, A0 };<br />
// segmentPins - Dp, A to G<br />
byte ledPins[] = {6, 4, 9, A2, A3, 2, 5, A1};<br />
<br />
PrintTo7Seg Seg7(numOfDigits, digPins, ledPins, </span><br />
<span style="font-family: 'Courier New', Courier, monospace;">COMMON_CATHODE);</span></blockquote>
<h4 style="text-align: left;">
Download</h4>
<div>
Скачать библиотеки можно на сайте <a href="http://blockduino.org/bd_downloads.htm" target="_blank">Blockduino.org</a>. </div>
<h4 style="text-align: left;">
Вот вывод примера "setLed_demo":</h4>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvTzgJkmBezU5-CA1M359jqhzn40SVerbfccLSm1DoJpiIovLn3rKaxYIPlwKZdKMfT5XIQSF8J9lX27NssvZDcz89TV69CE1hQw5d3s3zI-lI_FNFD3kExthKd_uUJiwn-AhxSwvR9EMy/s1600/Block7Seg-Khaos.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvTzgJkmBezU5-CA1M359jqhzn40SVerbfccLSm1DoJpiIovLn3rKaxYIPlwKZdKMfT5XIQSF8J9lX27NssvZDcz89TV69CE1hQw5d3s3zI-lI_FNFD3kExthKd_uUJiwn-AhxSwvR9EMy/s400/Block7Seg-Khaos.gif" width="400" /></a></div>
<br />
<h4 style="text-align: left;">
Ну и заодно вывод примера "Print_demo":</h4>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpb40IGkQ91aC11aCdmlICmwt0hJafRptsWQOc6myf0CT2Gh2x9QFaH23CYZEjAgkD3xKldaHg8T2gNolMPB-cNrM-xjxZKzMOvWmOh1SDYonK-2qAXh6gePsChGJZ5u7xrfVuphtSAUUc/s1600/Block7Seg-print.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpb40IGkQ91aC11aCdmlICmwt0hJafRptsWQOc6myf0CT2Gh2x9QFaH23CYZEjAgkD3xKldaHg8T2gNolMPB-cNrM-xjxZKzMOvWmOh1SDYonK-2qAXh6gePsChGJZ5u7xrfVuphtSAUUc/s400/Block7Seg-print.gif" width="400" /></a></div>
</div>
Vasyl Yudinhttp://www.blogger.com/profile/05599352575777495536noreply@blogger.com0tag:blogger.com,1999:blog-703725759950508617.post-44331390741590136892015-04-29T03:16:00.000-07:002015-04-29T03:17:06.394-07:00Block7Seg_IC - управляем семи сегментным дисплеем по трем проводам, вывод на дисплей данных функцией print()<div dir="ltr" style="text-align: left;" trbidi="on">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRMcVWhb2xpgjV6cFfSVeSroZu40pEkw-0im2cmI3-y_C3ht4Dbz1u2HvXRFRetbX2m87xZrXS_wjxf0vJIyMIkHZ2VFd3avhMCkWn7BTg76R_wGNSEiuADE6SC9QGVL2VHNsK1XV2yk7Z/s1600/1-CYMERA_20150406_103549.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRMcVWhb2xpgjV6cFfSVeSroZu40pEkw-0im2cmI3-y_C3ht4Dbz1u2HvXRFRetbX2m87xZrXS_wjxf0vJIyMIkHZ2VFd3avhMCkWn7BTg76R_wGNSEiuADE6SC9QGVL2VHNsK1XV2yk7Z/s1600/1-CYMERA_20150406_103549.jpg" height="133" width="200" /></a>Уже более года была готова плата этого блока, но купленные дисплей оказались с общим анодом, а нужны с общим катодом. Дело застопорилось, интерес угас.<br />
Но вот сошлись луны и был приобретен нужный дисплейчик. Плата перепаяна и проверена с помощью библиотеки LedContol. И как обычно бывает, функционал этой библиотеки меня совсем не устроил. Пришлось писать свою.<br />
Пока её ещё не выложу на общее пользование, т.к. хочу по максимуму поганять/отладить.<br />
<br />
<a name='more'></a><br />
Но для начала вот примерный список функций (помимо стандартных Write() и Print()):<br />
<br />
<pre> <span style="color: #cc6600;">Block7Seg_IC</span>(<span style="color: #cc6600;">byte</span> csPin=10, <span style="color: #cc6600;">byte</span> dataPin=11, <span style="color: #cc6600;">byte</span> clkPin=13, <span style="color: #cc6600;">byte</span> numDisplays=1);
<span style="color: #cc6600;">void</span> <span style="color: #cc6600;">setIntensity</span>(<span style="color: #cc6600;">byte</span> numDisplay, <span style="color: #cc6600;">byte</span> intensity);
<span style="color: #cc6600;">void</span> <span style="color: #cc6600;">setNumDigits</span>(<span style="color: #cc6600;">byte</span> numDisplay, <span style="color: #cc6600;">byte</span> numDigits);
<span style="color: #cc6600;">void</span> <span style="color: #cc6600;">display</span>(<span style="color: #cc6600;">byte</span> numDisplay = 0);
<span style="color: #cc6600;">void</span> <span style="color: #cc6600;">noDisplay</span>(<span style="color: #cc6600;">byte</span> numDisplay = 0);
<span style="color: #cc6600;">void</span> <span style="color: #cc6600;">displayTest</span>(<span style="color: #cc6600;">byte</span> numDisplay, <span style="color: #cc6600;">boolean</span> state);
<span style="color: #cc6600;">void</span> <span style="color: #cc6600;">setLed</span>(<span style="color: #cc6600;">byte</span> location, <span style="color: #cc6600;">byte</span> led, <span style="color: #cc6600;">boolean</span> state);
<span style="color: #cc6600;">void</span> <span style="color: #cc6600;">setDot</span>(<span style="color: #cc6600;">byte</span> location, <span style="color: #cc6600;">boolean</span> state);
<span style="color: #cc6600;">void</span> <span style="color: #cc6600;">setCursor</span>(<span style="color: #cc6600;">byte</span> location);
<span style="color: #cc6600;">void</span> <span style="color: #cc6600;">autoscroll</span>();
<span style="color: #cc6600;">void</span> <span style="color: #cc6600;">noAutoscroll</span>();
<span style="color: #cc6600;">void</span> <span style="color: #cc6600;">clear</span>();
<span style="color: #cc6600;">void</span> <span style="color: #cc6600;">home</span>();
<span style="color: #cc6600;">void</span> <span style="color: #cc6600;">scrollDisplayLeft</span>();
<span style="color: #cc6600;">void</span> <span style="color: #cc6600;">scrollDisplayRight</span>();
</pre>
<pre></pre>
И небольшая демонстрация работоспособности, результат работы этого скетча:<br />
<br />
<pre>#include <span style="color: #006699;">"lib_Block7Seg_IC.h"</span>
<span style="color: #cc6600;"> Block7Seg_IC</span> Seg7;
<span style="color: #cc6600;"> void</span> <span style="color: #cc6600;"><b>setup</b></span>() {
Seg7.<span style="color: #cc6600;">print</span>(<span style="color: #006699;">"YPA!"</span>);
}
<span style="color: #cc6600;"> void</span> <span style="color: #cc6600;"><b>loop</b></span>() {
}
</pre>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguGhEEpKpHkx3NH1mfGtDgDLtvp0lkjdn2gcmUvOX1jPwC2XhcDZTUaBuOc67aGq61TF-Y_4m-sF3xwagJf2nfS6Z951BOyOIH2DTUGW7x6y4xMFhwbCeq_-ruQuSMoiNx6qkZ-MNnumrq/s1600/3-20150428_225846.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguGhEEpKpHkx3NH1mfGtDgDLtvp0lkjdn2gcmUvOX1jPwC2XhcDZTUaBuOc67aGq61TF-Y_4m-sF3xwagJf2nfS6Z951BOyOIH2DTUGW7x6y4xMFhwbCeq_-ruQuSMoiNx6qkZ-MNnumrq/s1600/3-20150428_225846.jpg" height="425" width="640" /></a></div>
зы: Кирилицы на самом деле нет, да и вряд ли будет.</div>
Vasyl Yudinhttp://www.blogger.com/profile/05599352575777495536noreply@blogger.com0tag:blogger.com,1999:blog-703725759950508617.post-5714653116163675412014-11-15T18:44:00.001-08:002014-11-29T23:44:35.481-08:00Игра Simon Say 7Notes<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyQkoahIhvv0H83c74cyoEhJkpxpW-MaRppzyY80uDw6o2fljvLT1_wQsTKN3sttytKuItvrv0TuAo7PjP6rzzI7mNVSWBE3n2Y571BuDEa_LmYtk_Mv4OEhLW4dMu2MV0tdOtUJmA4kF8/s1600/Simon_Says_7Notes_1.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyQkoahIhvv0H83c74cyoEhJkpxpW-MaRppzyY80uDw6o2fljvLT1_wQsTKN3sttytKuItvrv0TuAo7PjP6rzzI7mNVSWBE3n2Y571BuDEa_LmYtk_Mv4OEhLW4dMu2MV0tdOtUJmA4kF8/s1600/Simon_Says_7Notes_1.jpg" height="133" width="200" /></a></div>
<br />
<span id="goog_692796145"></span><span id="goog_692796146"></span>Продолжение предыдущего поста - <a href="http://blockduino.blogspot.com/2014/11/simon-say-blockduino.html" target="_blank">Игра Simon Say на Blockduino</a> - игра в которой нужно повторить все усложняющуюся последовательность загорающихся светодиодов. Общим количеством в семь. Так же каждому светодиоду соответствует нота, которая звучит одновременно со светящимся светодиодом.<br />
<br />
<a name='more'></a>Конечно светодиодов о семи цветах не нашлось, но скомпоновал примерно вот так:<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDWwtueMIcvxnD7RUqs42wnEWjHCKymSpkYWE50Xjh0FoK3yu-aVw7Fhvj4xf_fnt-vYLeFafA2HK67hOhesAaO1YUZ63HvO5M_wwRcuc2YLN7vmYXHD1bZEnSfiYO0Bel0SHYoKHm4skh/s1600/Simon_Says_7Notes_2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDWwtueMIcvxnD7RUqs42wnEWjHCKymSpkYWE50Xjh0FoK3yu-aVw7Fhvj4xf_fnt-vYLeFafA2HK67hOhesAaO1YUZ63HvO5M_wwRcuc2YLN7vmYXHD1bZEnSfiYO0Bel0SHYoKHm4skh/s1600/Simon_Says_7Notes_2.jpg" height="425" width="640" /></a><br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<h3 style="text-align: left;">
Алгоритм игры</h3>
<div>
При включении игра ждет нажатия кнопки для запуска игры (в процессе ожидания периодически помаргивают светодиоды и попискивает зуммер :)</div>
<div>
В начале игра показывает два случайных светодиода и одновременно звучит привязанная к каждому светодиоду нота (теоретически нотная гамма - нижний 'до', вернхний - 'си', но так как я нотной грамоте не обучен и шибко неохота в нее вкапываться, то выбрал примерно наобум. Поправьте, плиз, кто может!)</div>
<div>
Дальше, крутя ручку резистора, выбираем правильный светодиод (слыша соответствующую ноту) и нажимаем кнопу, фиксируя выбор. И так от двух (начальная сложность) до десяти (самая сложная последовательность).</div>
<div>
В отличие от предыдущей игры, где проигрывается одна и та же последовательность, просто постоянно удлиняясь, в этой игре последовательность меняется каждый раз.</div>
<h3 style="text-align: left;">
Код:</h3>
<div style="margin: 5px 20px 20px;">
<div class="smallfont" style="margin-bottom: 2px;">
Код под спойлером: <input onclick="if (this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display != '') { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = ''; this.innerText = ''; this.value = 'Скрыть'; } else { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = 'none'; this.innerText = ''; this.value = 'Показать'; }" style="font-size: 10px; margin: 0px; padding: 0px; width: 60px;" type="button" value="Показать" /> </div>
Исходный код и библиотека к коду на сайте; <a href="http://madrid.verkstad.cc/en/course-literature/simon-says/#more-2318" target="_blank">http://madrid.verkstad.cc/</a><br />
<div class="alt2" style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-size: auto auto; background-attachment: scroll; background-color: whitesmoke; background-image: none; background-position: 0% 50%; background-repeat: repeat; border: 1px inset; line-height: 1.5em; margin: 0px; padding: 6px;">
<div style="display: none;">
<!-- Начало вставки --><br />
<pre><span style="color: #7e7e7e;">/*</span>
<span style="color: #7e7e7e;"> Simon Says</span>
<span style="color: #7e7e7e;"> Test your memory with this game!</span>
<span style="color: #7e7e7e;"> LEDs will blink in a pattern that you have to remember and repeat. </span>
<span style="color: #7e7e7e;"> If you get it right, the game gets more and more challenging. </span>
<span style="color: #7e7e7e;"> (c) 2014 Aduino Verkstad</span>
<span style="color: #7e7e7e;"> </span>
<span style="color: #7e7e7e;"> Simon Says 7 Notes</span>
<span style="color: #7e7e7e;"> Modified to play 7 notes with LEDs</span>
<span style="color: #7e7e7e;"> Add stand-by with effects</span>
<span style="color: #7e7e7e;"> Oct-2014 Vasyl Yudin</span>
<span style="color: #7e7e7e;"> www.blockduino.org</span>
<span style="color: #7e7e7e;">*/</span>
#include <BasicEducationShield.h>
#include <span style="color: #006699;">"pitches.h"</span>
<span style="color: #7e7e7e;">/*</span>
<span style="color: #7e7e7e;"> An array of pin numbers to which LEDs are attached</span>
<span style="color: #7e7e7e;"> the defaults are 2 to 8 but you can choose any of the digital </span>
<span style="color: #7e7e7e;"> pins. </span>
<span style="color: #7e7e7e;">*/</span>
<span style="color: #cc6600;">int</span> pinCount = 7;
<span style="color: #cc6600;">int</span> ledPins[] = {2, 3, 4, 5, 6, 7, 8};
<span style="color: #cc6600;">int</span> notes[] = {NOTE_C7, NOTE_D7, NOTE_E7, NOTE_F7, NOTE_G7, NOTE_A7, NOTE_B7};
<span style="color: #cc6600;">VUMeter</span> vuMeter;
<span style="color: #cc6600;">boolean</span> isPlaing = <span style="color: #cc6600;">false</span>;
<span style="color: #cc6600;">Knob</span> pot = <span style="color: #cc6600;">Knob</span>(A0);<span style="color: #7e7e7e;">//a knob is connected to A0</span>
<span style="color: #cc6600;">Button</span> button = <span style="color: #cc6600;">Button</span>(10); <span style="color: #7e7e7e;">//a button is connected to D10</span>
<span style="color: #cc6600;">Melody</span> piezo = <span style="color: #cc6600;">Melody</span>(9);<span style="color: #7e7e7e;">//a piezo is connected to D9</span>
<span style="color: #7e7e7e;">//Set the game parameters</span>
<span style="color: #cc6600;">const</span> <span style="color: #cc6600;">int</span> turns_begin=2;<span style="color: #7e7e7e;">//a new game starts with 2 turns</span>
<span style="color: #cc6600;">const</span> <span style="color: #cc6600;">int</span> turns_max=10;<span style="color: #7e7e7e;">//the most difficult game has 10 turns</span>
<span style="color: #cc6600;">int</span> game[turns_max];<span style="color: #7e7e7e;">//array for storing the "simon says "</span>
<span style="color: #cc6600;">int</span> turns=turns_begin;<span style="color: #7e7e7e;">//for storing the number of turns in current game</span>
<span style="color: #cc6600;">int</span> blinkTime=500;<span style="color: #7e7e7e;">//how fast does "simon says" blink</span>
<span style="color: #cc6600;">void</span> <span style="color: #cc6600;"><b>setup</b></span>(){
<span style="color: #7e7e7e;">//initialize the components</span>
vuMeter.<span style="color: #cc6600;">config</span>(pinCount, ledPins);
vuMeter.<span style="color: #cc6600;">begin</span>();
pot.<span style="color: #cc6600;">setLevels</span>(pinCount);
button.<span style="color: #cc6600;">begin</span>();
<span style="color: #7e7e7e;">//Create a random seed, so we can call random() later.</span>
<span style="color: #cc6600;">randomSeed</span>(<span style="color: #cc6600;">analogRead</span>(A5));
}
<span style="color: #cc6600;">void</span> <span style="color: #cc6600;"><b>loop</b></span>(){
<span style="color: #cc6600;">if</span> (!isPlaing) waiting();
newGame();
simonSays();
<span style="color: #cc6600;">delay</span>(1000);
getInputs();
}
<span style="color: #cc6600;">void</span> newGame(){
isPlaing = <span style="color: #cc6600;">true</span>;
vuMeter.<span style="color: #cc6600;">blinkAll</span>(200, 3);
vuMeter.<span style="color: #cc6600;">clear</span>();
<span style="color: #cc6600;">delay</span>(500);
<span style="color: #7e7e7e;">//Generate simon says, it'll be stored in an array</span>
<span style="color: #7e7e7e;">//So we can compare with player's input later</span>
<span style="color: #cc6600;">for</span>(<span style="color: #cc6600;">int</span> i=0;i<turns;i++){
game[i]=<span style="color: #cc6600;">random</span>(pinCount);
}
}
<span style="color: #cc6600;">void</span> simonSays(){
<span style="color: #7e7e7e;">//Display simon says to the player. </span>
<span style="color: #cc6600;">for</span>(<span style="color: #cc6600;">int</span> i=0;i<turns;i++){
vuMeter.<span style="color: #cc6600;">on</span>(game[i]);
piezo.<span style="color: #cc6600;">beep</span>(notes[game[i]], blinkTime);
<span style="color: #7e7e7e;">// delay(blinkTime);</span>
vuMeter.<span style="color: #cc6600;">off</span>(game[i]);
<span style="color: #cc6600;">delay</span>(blinkTime);
}
}
<span style="color: #cc6600;">void</span> getInputs(){
<span style="color: #7e7e7e;">//Get "i" inputs where "i" matches the number of </span>
<span style="color: #7e7e7e;">//simon says in this round.</span>
<span style="color: #cc6600;">for</span>(<span style="color: #cc6600;">int</span> i=0;i<turns;i++){
<span style="color: #cc6600;">int</span> input;
<span style="color: #7e7e7e;">//button.released() stops the program, so</span>
<span style="color: #7e7e7e;">//let's do it in short pulses, in between </span>
<span style="color: #7e7e7e;">//we can change the vuMeter display.</span>
<span style="color: #cc6600;">while</span>(!button.<span style="color: #cc6600;">getState</span>()){
vuMeter.<span style="color: #cc6600;">clear</span>();
vuMeter.<span style="color: #cc6600;">on</span>(pot.getLevel());
<span style="color: #cc6600;">delay</span>(100);
}
<span style="color: #7e7e7e;">//When button is released, get the adjusted </span>
<span style="color: #7e7e7e;">//value from the knob</span>
input=pot.getLevel();
<span style="color: #cc6600;">if</span>(input==game[i]){
<span style="color: #7e7e7e;">//if your input is right, play a score sound</span>
<span style="color: #7e7e7e;">//and continue.</span>
piezo.<span style="color: #cc6600;">beep</span>(notes[game[i]], blinkTime);
}<span style="color: #cc6600;">else</span>{
<span style="color: #7e7e7e;">//Otherwise, gameover. Stop the function from</span>
<span style="color: #7e7e7e;">//continuing by an empty return.</span>
gameOver();
<span style="color: #cc6600;">return</span> ;
}
}
<span style="color: #7e7e7e;">//When all the inputs matched simon says, you win</span>
<span style="color: #7e7e7e;">//this round and level up.</span>
<span style="color: #cc6600;">delay</span>(500);
levelUp();
}
<span style="color: #cc6600;">void</span> gameOver(){
<span style="color: #7e7e7e;">//When it's gameover, difficutly resets </span>
turns=turns_begin;
<span style="color: #7e7e7e;">//And play the gameover sound</span>
piezo.<span style="color: #cc6600;">effect_gameover</span>();
isPlaing = <span style="color: #cc6600;">false</span>;
}
<span style="color: #cc6600;">void</span> levelUp(){
<span style="color: #7e7e7e;">//When level up, adds more difficulty until it reaches maximum</span>
<span style="color: #cc6600;">if</span>(turns<turns_max){
turns++;
}
<span style="color: #7e7e7e;">//And play a wining sound</span>
piezo.<span style="color: #cc6600;">effect_win</span>();
}
<span style="color: #cc6600;">void</span> waiting(){
<span style="color: #7e7e7e;">//After finish game wait to start game by pressing button</span>
<span style="color: #cc6600;">int</span> i = 0;
<span style="color: #cc6600;">const</span> <span style="color: #cc6600;">int</span> timeout = 100;
<span style="color: #cc6600;">while</span>(!button.<span style="color: #cc6600;">getState</span>()){
i = (i+1) % timeout;
<span style="color: #cc6600;">if</span> (i < pinCount) {
vuMeter.<span style="color: #cc6600;">on</span>(i);
piezo.<span style="color: #cc6600;">beep</span>(notes[i], 25);
vuMeter.<span style="color: #cc6600;">off</span>(i);
}
<span style="color: #cc6600;">delay</span>(50);
}
}
</pre>
<!-- Конец вставки --><br />
<br />
<br /></div>
</div>
</div>
<h3 style="text-align: left;">
Больше фото</h3>
<table align="center" border="0" style="width: 100%px;"><tbody>
<tr> <td><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwamIy-olsmble64x7QmOYqtwLgjEsfbPmQhfU4BKsCGy-zPeU6CmEsfB1QXqtfqDjz_T6Q8PtVBmZF8LCgvXFukReu55O_N750FlnNnfDU9eA6MjpPrGCHzHmrGqYYUwtT-tA8AdYDSb7/s1600/Simon_Says_7Notes_3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwamIy-olsmble64x7QmOYqtwLgjEsfbPmQhfU4BKsCGy-zPeU6CmEsfB1QXqtfqDjz_T6Q8PtVBmZF8LCgvXFukReu55O_N750FlnNnfDU9eA6MjpPrGCHzHmrGqYYUwtT-tA8AdYDSb7/s1600/Simon_Says_7Notes_3.jpg" height="213" width="320" /></a></div>
</td> <td><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitAvLJ5HFr5nz7615myOq8L5taKZJgbglAlin6vu5QbSz1cTAT-44QXtjWRUCRWOuRNgDyhA_ZNvIipCnr2XVLUEArvj_P2iP0T4Ne9ArTEQ2SmLPL00ODeldc5Ki2vmWZTQ2yv4VAdLHy/s1600/Simon_Says_7Notes_4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitAvLJ5HFr5nz7615myOq8L5taKZJgbglAlin6vu5QbSz1cTAT-44QXtjWRUCRWOuRNgDyhA_ZNvIipCnr2XVLUEArvj_P2iP0T4Ne9ArTEQ2SmLPL00ODeldc5Ki2vmWZTQ2yv4VAdLHy/s1600/Simon_Says_7Notes_4.jpg" height="214" width="320" /></a></div>
</td> </tr>
<tr> <td><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8l3tot3gNdVxjdaIMhYDlkmb2T3FFMVpcRaSRAu6Os-8X1bXKT_oua_ja3MdjakAg0Ci6VPrZeRBi_9WdSO6lun4waoZqMpzwVSgi612aHUIFQHmDPXjJTyurIpIBoY49FlE_Oww9abgJ/s1600/Simon_Says_7Notes_5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8l3tot3gNdVxjdaIMhYDlkmb2T3FFMVpcRaSRAu6Os-8X1bXKT_oua_ja3MdjakAg0Ci6VPrZeRBi_9WdSO6lun4waoZqMpzwVSgi612aHUIFQHmDPXjJTyurIpIBoY49FlE_Oww9abgJ/s1600/Simon_Says_7Notes_5.jpg" height="213" width="320" /></a></div>
</td> <td><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1Gf8DXGOQImNP5cg694KVSrGJYOh_mX38ZUdiO0Ng7Tw9kkKiTIcQfIE2O4h1PBnWUTtF2icTUEp3Ba3Jr0J72hSmvI9ajHQcZEnpUIv33Hwq7TXIm3UygaPgyCUSG43lOXZQpXdKeaNw/s1600/Simon_Says_7Notes_7.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1Gf8DXGOQImNP5cg694KVSrGJYOh_mX38ZUdiO0Ng7Tw9kkKiTIcQfIE2O4h1PBnWUTtF2icTUEp3Ba3Jr0J72hSmvI9ajHQcZEnpUIv33Hwq7TXIm3UygaPgyCUSG43lOXZQpXdKeaNw/s1600/Simon_Says_7Notes_7.jpg" height="213" width="320" /></a></div>
</td> </tr>
</tbody></table>
<div>
</div>
<h3 style="text-align: left;">
Видео отчет</h3>
<div>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/2tWvuwLup8k?feature=player_embedded' frameborder='0'></iframe></div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
</div>
Vasyl Yudinhttp://www.blogger.com/profile/05599352575777495536noreply@blogger.com0tag:blogger.com,1999:blog-703725759950508617.post-73482864859185442192014-11-02T07:49:00.000-08:002014-11-15T19:44:47.238-08:00Игра Simon Say на Blockduino <div dir="ltr" style="text-align: left;" trbidi="on">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7r4M38CE-rAFNx0OrZO2_DAKcUdiM4DC_JLj5HEBY8oda_namDyaMjoOrAQZRhpyDTIByPxZMxa2ZPlXefxIJR_XAsPPsZYaZ4iSjYdkzGP1wBOJlQiOSzIDKt2IiPZkzvil8HCU2i2wg/s1600/1_Simon_Says_on_blockduino.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7r4M38CE-rAFNx0OrZO2_DAKcUdiM4DC_JLj5HEBY8oda_namDyaMjoOrAQZRhpyDTIByPxZMxa2ZPlXefxIJR_XAsPPsZYaZ4iSjYdkzGP1wBOJlQiOSzIDKt2IiPZkzvil8HCU2i2wg/s1600/1_Simon_Says_on_blockduino.jpg" height="213" width="320" /></a>Как-то встретил товарища, который тоже увлекается Ардуинкой. И похвастался он... Та неа, не похвастался, а просто между прочим проскользнуло, что делал он игру Simon Say и она очень понравилась его сыну.<br />
Ессно и мне захотелось посмотреть, что она из себя представляет. Тем более, есть из чего делать.<br />
Нашел пару вариантов.<br />
<h3 style="text-align: left;">
Сначала классический:</h3>
Четыре разноцветных кнопки и соответствующего цвета светодиоды. И одна кнопка для запуска игры.<br />
Взято все отсюда: <a href="http://scuola.arduino.cc/lesson/DWzMEJ8/A_simple_Simon_Says_game">http://scuola.arduino.cc/</a><br />
<br />
<a name='more'></a>Т.е. нам нужны:<br />
<ul style="text-align: left;">
<li><a href="http://blockduino.org/mediawiki/index.php?title=BlockDuino" target="_blank">Blockduino</a> - 1 шт</li>
<li><a href="http://blockduino.org/mediawiki/index.php?title=BlockIO" target="_blank">BlockIO </a>- 1 шт</li>
<li><a href="http://blockduino.org/mediawiki/index.php?title=BigButton" target="_blank">Cleclo-BigButton</a> - 5 шт</li>
<li><a href="http://blockduino.org/mediawiki/index.php?title=LED" target="_blank">Cleclo-LED</a> - 4 шт</li>
</ul>
Подключал все в другие порты, чем в примере. Позже объясню почему. Подключил все в плату <a href="http://blockduino.org/mediawiki/index.php?title=BlockIO" target="_blank">BlockIO</a>, хотя, т.к. здесь используются только цифровые порты, можно было бы подключить и в платку <a href="http://blockduino.org/mediawiki/index.php?title=PlugIO" target="_blank">PlugDIO</a>, но в следующем примере будет использован и аналоговый порт, поэтому, чтоб не переставлять туда-сюда сразу установил BlockIO.<br />
<br />
<table align="center" border="0" style="width: 100%px;"><tbody>
<tr> <td><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKtSB-VCees6zql0droVIVTYGCATM5c78QimvqKczwuURW3dJ070fLy62cL2_06Jo0fpS8EsFgeAVNKy6YvBmN3jS0CqBxfLeKhhWbPkUG44uft2bY-FA64cjh_j5Nk_jXeOqUi-fhyDMY/s1600/2_Simon_Says_on_blockduino.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKtSB-VCees6zql0droVIVTYGCATM5c78QimvqKczwuURW3dJ070fLy62cL2_06Jo0fpS8EsFgeAVNKy6YvBmN3jS0CqBxfLeKhhWbPkUG44uft2bY-FA64cjh_j5Nk_jXeOqUi-fhyDMY/s1600/2_Simon_Says_on_blockduino.jpg" height="212" width="320" /></a></td> <td><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEM4CyyGlZ7qu8FiSUlvTr-D1Q39e0VDUSoxeJna8MAg3Z6Im_r0W5LcNrlaROwSyvuOiHTl1b2XfSzGi6xSlGbwF7I-Sva5gI5CLPsimrk5nQXWSMr4mSOkbiNqnxhaf6o6WFVSHhD3wQ/s1600/3_Simon_Says_on_blockduino.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEM4CyyGlZ7qu8FiSUlvTr-D1Q39e0VDUSoxeJna8MAg3Z6Im_r0W5LcNrlaROwSyvuOiHTl1b2XfSzGi6xSlGbwF7I-Sva5gI5CLPsimrk5nQXWSMr4mSOkbiNqnxhaf6o6WFVSHhD3wQ/s1600/3_Simon_Says_on_blockduino.jpg" height="212" width="320" /></a></td> </tr>
</tbody></table>
<br />
Код переправил немного под себя, но пока не выложу, т.к. мне не понравилось резкое моргание светодиодами. Т.к. светодиоды большие (10 мм), то при резком включении и выключении бьет по глазам. А так как на микроконтроллере есть четыре порта с ШИМ'ом, то можно организовать плавное зажигание и затухание светодиодов. Поэтому я их и подключил в порта D5, D6, D9 и D10.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEb2znpEvaMnLyCNyWLq3O56Iey1rx_3CIr9_kYoCGUfLbCmaBRB9FTBrPQ88pCw5a0ZmCZ53T93ZaJNczjJCSH9nAmII7EzeBiJRuORnjNrLnjQYa9tTnregrcVy11L4eKQhxuOpkGlho/s1600/4_Simon_Says_on_blockduino.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEb2znpEvaMnLyCNyWLq3O56Iey1rx_3CIr9_kYoCGUfLbCmaBRB9FTBrPQ88pCw5a0ZmCZ53T93ZaJNczjJCSH9nAmII7EzeBiJRuORnjNrLnjQYa9tTnregrcVy11L4eKQhxuOpkGlho/s1600/4_Simon_Says_on_blockduino.jpg" height="425" width="640" /></a></div>
<br />
<h4 style="text-align: left;">
Update: Вариант классический, но без пусковой кнопки и с плавными светодиодами</h4>
<div>
В общем, сделал как хотел и даже чуточку больше: выбросил пусковую кнопку (зачем она нужна, если в режиме ожидания простаивают все остальные), теперь нажатие любой кнопки запускает игру; упростил код подключив библиотеки 'LED.h' и 'Button.h'; добавил плавность зажигания светодиодов; ну и попутно изменил режим моргания светодиодами в режиме ожидания.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://www.blogger.com/blogger.g?blogID=703725759950508617" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpOBZEE1wmUlaE3ppfTXA-m2mAsEkzOksqwIPNViB7uzolMDC3EudBksH9_OEjC2P5QcYAzoE3fyAKw-fL7WUXEvD2ClzRDtS6vgMVNpH44PdFlEQ3xkNx0sW2yEiBDbAlJs5BW2sg5u6a/s1600/Simon_Says_Faded.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Simon Say Faded LEDs" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpOBZEE1wmUlaE3ppfTXA-m2mAsEkzOksqwIPNViB7uzolMDC3EudBksH9_OEjC2P5QcYAzoE3fyAKw-fL7WUXEvD2ClzRDtS6vgMVNpH44PdFlEQ3xkNx0sW2yEiBDbAlJs5BW2sg5u6a/s1600/Simon_Says_Faded.jpg" height="424" title="Simon Say Faded LEDs" width="640" /></a></div>
</div>
<br />
<!-- Начало спойлера--><br />
<div style="margin: 5px 20px 20px;">
<div class="smallfont" style="margin-bottom: 2px;">
Код под спойлером: <input onclick="if (this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display != '') { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = ''; this.innerText = ''; this.value = 'Скрыть'; } else { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = 'none'; this.innerText = ''; this.value = 'Показать'; }" style="font-size: 10px; margin: 0px; padding: 0px; width: 60px;" type="button" value="Показать" /> </div>
<br />
<div class="alt2" style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-size: auto auto; background-attachment: scroll; background-color: whitesmoke; background-image: none; background-position: 0% 50%; background-repeat: repeat; border: 1px inset; line-height: 1.5em; margin: 0px; padding: 6px;">
<div style="display: none;">
<!-- Начало вставки --><br />
<pre><span style="color: #7e7e7e;">/*This sketch is a version of the famous Simon Says game. You can use it and improved it adding</span>
<span style="color: #7e7e7e;"> levels and everything you want to increase the diffuculty!</span>
<span style="color: #7e7e7e;"> </span>
<span style="color: #7e7e7e;"> author : Arturo Guadalupi <a.guadalupi@arduino.cc></span>
<span style="color: #7e7e7e;"> edited : Vasyl Yudin <vasyl.yudin@gmail.com></span>
<span style="color: #7e7e7e;"> */</span>
#include <<span style="color: #cc6600;">Button</span>.h>
#include <<span style="color: #cc6600;">LED</span>.h>
<span style="color: #cc6600;">const</span> <span style="color: #cc6600;">int</span> bttn_start = 4;
<span style="color: #cc6600;">const</span> <span style="color: #cc6600;">int</span> max_level = 100;
<span style="color: #cc6600;">Button</span> bttn[4] = { <span style="color: #cc6600;">Button</span>(2), <span style="color: #cc6600;">Button</span>(7), <span style="color: #cc6600;">Button</span>(8), <span style="color: #cc6600;">Button</span>(3) };
<span style="color: #cc6600;">LED</span> led[4] = { <span style="color: #cc6600;">LED</span>(5), <span style="color: #cc6600;">LED</span>(6), <span style="color: #cc6600;">LED</span>(9), <span style="color: #cc6600;">LED</span>(10) };
<span style="color: #cc6600;">int</span> sequence[max_level];
<span style="color: #cc6600;">int</span> your_sequence[max_level];
<span style="color: #cc6600;">int</span> level = 1;
<span style="color: #cc6600;">int</span> velocity = 250;
<span style="color: #cc6600;">void</span> <span style="color: #cc6600;"><b>setup</b></span>() {
<span style="color: #cc6600;"><b>Serial</b></span>.<span style="color: #cc6600;">begin</span>(9600);
ready();
<span style="color: #cc6600;">delay</span>(1000);
}
<span style="color: #cc6600;">void</span> <span style="color: #cc6600;"><b>loop</b></span>()
{
<span style="color: #cc6600;">if</span> ( bttn[0].<span style="color: #cc6600;">isPressed</span>() ||
bttn[1].<span style="color: #cc6600;">isPressed</span>() ||
bttn[2].<span style="color: #cc6600;">isPressed</span>() ||
bttn[3].<span style="color: #cc6600;">isPressed</span>() ||
level != 1) <span style="color: #7e7e7e;">//If any button is pressed or you're plaing</span>
{
show_sequence(); <span style="color: #7e7e7e;">//show the sequence</span>
get_sequence(); <span style="color: #7e7e7e;">//wait for your sequence</span>
}
<span style="color: #cc6600;">else</span> {
generate_sequence();<span style="color: #7e7e7e;">//generate a sequence;</span>
ready();
}
}
<span style="color: #cc6600;">void</span> show_sequence()
{
<span style="color: #cc6600;">for</span> (<span style="color: #cc6600;">int</span> i=0; i<4; i++)
led[i].<span style="color: #cc6600;">off</span>();
<span style="color: #cc6600;">for</span> (<span style="color: #cc6600;">int</span> i = 0; i < level; i++)
{
led[sequence[i]].<span style="color: #cc6600;">fadeIn</span>(velocity);
led[sequence[i]].<span style="color: #cc6600;">fadeOut</span>(velocity/2);
<span style="color: #cc6600;">delay</span>(200);
}
}
<span style="color: #cc6600;">void</span> get_sequence()
{
<span style="color: #cc6600;">int</span> isPush = 0; <span style="color: #7e7e7e;">//this flag indicates if the sequence is correct</span>
<span style="color: #cc6600;">for</span> (<span style="color: #cc6600;">int</span> j=0; j<level; j++)
{
isPush = 0;
<span style="color: #cc6600;">while</span>(isPush == 0)
{
<span style="color: #cc6600;">for</span>(<span style="color: #cc6600;">int</span> i=0; i<4; i++)
<span style="color: #cc6600;">if</span> (bttn[i].<span style="color: #cc6600;">isPressed</span>())
{
led[i].<span style="color: #cc6600;">on</span>();
your_sequence[j] = i;
isPush = 1;
<span style="color: #cc6600;">delay</span>(200);
<span style="color: #cc6600;">if</span> (your_sequence[j] != sequence[j])
{
wrong_sequence();
<span style="color: #cc6600;">return</span>;
}
led[i].<span style="color: #cc6600;">off</span>();
}
}
}
right_sequence();
}
<span style="color: #cc6600;">void</span> generate_sequence()
{
<span style="color: #cc6600;">randomSeed</span>(<span style="color: #cc6600;">millis</span>()); <span style="color: #7e7e7e;">//in this way is really random!!!</span>
<span style="color: #cc6600;">int</span> randPin;
<span style="color: #cc6600;">for</span> (<span style="color: #cc6600;">int</span> i = 0; i < max_level; i++)
{
sequence[i] = (<span style="color: #cc6600;">int</span>)<span style="color: #cc6600;">random</span>(4);
}
}
<span style="color: #cc6600;">void</span> wrong_sequence()
{
led[0].<span style="color: #cc6600;">on</span>();
led[1].<span style="color: #cc6600;">on</span>();
led[2].<span style="color: #cc6600;">off</span>();
led[3].<span style="color: #cc6600;">off</span>();
<span style="color: #cc6600;">for</span> (<span style="color: #cc6600;">int</span> j=0; j<10; j++)
{
<span style="color: #cc6600;">for</span>(<span style="color: #cc6600;">int</span> i=0; i<4; i++){
led[i].<span style="color: #cc6600;">toggle</span>();
}
<span style="color: #cc6600;">delay</span>(250);
}
level = 1;
velocity = 250;
}
<span style="color: #cc6600;">void</span> right_sequence()
{
<span style="color: #cc6600;">for</span> (<span style="color: #cc6600;">int</span> i=0; i<4; i++)
led[i].<span style="color: #cc6600;">off</span>();
<span style="color: #cc6600;">for</span> (<span style="color: #cc6600;">int</span> i=0; i<4; i++)
led[i].<span style="color: #cc6600;">fadeIn</span>(100);
<span style="color: #cc6600;">for</span> (<span style="color: #cc6600;">int</span> i=0; i<4; i++)
led[i].<span style="color: #cc6600;">fadeOut</span>(100);
<span style="color: #cc6600;">delay</span>(500);
<span style="color: #cc6600;">if</span> (level < max_level)
level++;
velocity -= 5; <span style="color: #7e7e7e;">//increase difficulty</span>
}
<span style="color: #cc6600;">void</span> ready() {<span style="color: #7e7e7e;">// lights up leds during stand-by</span>
<span style="color: #cc6600;">int</span> time = <span style="color: #cc6600;">millis</span>()/16;
<span style="color: #cc6600;">for</span>(<span style="color: #cc6600;">int</span> i=0; i<4; i++)
{
led[i].<span style="color: #cc6600;">setValue</span>(255-(time+i*32)%128);
<span style="color: #cc6600;"><b>Serial</b></span>.<span style="color: #cc6600;">print</span>((255-(time+i*32)%128));<span style="color: #cc6600;"><b>Serial</b></span>.<span style="color: #cc6600;">print</span>(<span style="color: #006699;">" "</span>);
}
<span style="color: #cc6600;"><b>Serial</b></span>.<span style="color: #cc6600;">println</span>();
<span style="color: #cc6600;">delay</span>(100);
}
</pre>
<!-- Конец вставки --><br />
<br />
<br /></div>
</div>
</div>
<!-- Конец спойлера--><br />
<br />
<h3 style="text-align: left;">
Вариант другой</h3>
<div>
Описан здесь: <a href="http://madrid.verkstad.cc/en/course-literature/simon-says/#more-2318" target="_blank">http://madrid.verkstad.cc/</a></div>
<div>
Здесь ввод уже не с кнопок, а с одного резистора. Соответственно и больше пространства для маневров: можно добавить больше светодиодов, например семь; можно подключить зуммер и изменять его тональность: каждому светодиоду - свою ноту, т.е. развивать еще и слуховую память.</div>
<div>
<strike>Но это я апробирую чуток позже...</strike><br />
Уже попробовал, вот он:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7eWLKan0o-TOG9PrFlIIkyd5G6k_7uOueFsD1zKtYY4SacXEIMAK0nxZvHF4xt6XTD9vyBXwgLZHOoLNxljjANpodfu4HNLWslsTFTYciy35UwhAsJ2csMxFgvlgFSCVUIfoTzRNs-KsC/s1600/1-Simon_Says_7Notes.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7eWLKan0o-TOG9PrFlIIkyd5G6k_7uOueFsD1zKtYY4SacXEIMAK0nxZvHF4xt6XTD9vyBXwgLZHOoLNxljjANpodfu4HNLWslsTFTYciy35UwhAsJ2csMxFgvlgFSCVUIfoTzRNs-KsC/s1600/1-Simon_Says_7Notes.jpg" height="426" width="640" /></a></div>
Но описание и код <strike>будут</strike> уже в <a href="http://blockduino.blogspot.com/2014/11/simon-say-7notes.html" target="_blank">следующей статье</a>.</div>
</div>
Vasyl Yudinhttp://www.blogger.com/profile/05599352575777495536noreply@blogger.com0tag:blogger.com,1999:blog-703725759950508617.post-21245400112491571032014-10-17T19:47:00.003-07:002014-10-17T19:47:31.084-07:00Сейфовый кодовый замок с семисегментным дисплеем - SafeLock with 1 pot and 7Seg display<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHViJwlBy7cLfzYonpcg4MzB-Dz0mQyuAv8GFy-8G2j00fB3gmjExJpkndaYk2uKhzEljCHQHLvPCnuKzXtL1MmLlPPZnszcHpk60V9xb0o-RV2SSa_dFcq0wkXUpX4u-y_uhzHNIMoylh/s1600/SafeLock-1.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img alt="SafeLock - one pot locking on arduino" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHViJwlBy7cLfzYonpcg4MzB-Dz0mQyuAv8GFy-8G2j00fB3gmjExJpkndaYk2uKhzEljCHQHLvPCnuKzXtL1MmLlPPZnszcHpk60V9xb0o-RV2SSa_dFcq0wkXUpX4u-y_uhzHNIMoylh/s1600/SafeLock-1.jpg" height="150" title="SafeLock - one pot locking on arduino" width="200" /></a></div>
В продолжение к разным кодовым замкам.<br />
Появилась идея сделать "минимальный" кодовый замок, т.е. из минимального набора элементов: процессор (обработка инфо), резистор (ввод кода), светодиод (вывод инфо) и сервомотор (исполнительный механизм).<br />
Но это будет чуть позже, т.к. в процессе творчества захотелось добавить блок Block7Seg, для более удобного вывода информации (а если честно, то просто нет под рукой из чего сделать диск с номерами для резистора, а в слепую вводить код не получится, поэтому контроль ввода кода происходит по Block7Seg).<br />
<br />
<a name='more'></a><br />
<h3 style="text-align: left;">
Состав</h3>
Итак кодовый замок состоит из:<br />
<div>
<table border="0" style="text-align: center;"><tbody>
<tr> <td><div style="text-align: left;">
<a href="http://blockduino.org/mediawiki/index.php?title=BlockDuino" target="_blank">Blockduino</a></div>
</td> <td><div style="text-align: left;">
1 шт</div>
</td> </tr>
<tr> <td><div style="text-align: left;">
<a href="http://blockduino.org/mediawiki/index.php?title=Block7Seg" target="_blank">Block7Seg</a></div>
</td> <td><div style="text-align: left;">
1 шт</div>
</td> </tr>
<tr> <td><div style="text-align: left;">
<a href="http://blockduino.org/mediawiki/index.php?title=Pot" target="_blank">CleClo-Pot</a></div>
</td> <td><div style="text-align: left;">
1 шт</div>
</td> </tr>
<tr> <td><div style="text-align: left;">
<a href="http://blockduino.org/mediawiki/index.php?title=GVS" target="_blank">Трехжильный кабель</a></div>
</td> <td><div style="text-align: left;">
1 шт</div>
</td> </tr>
<tr> <td><div style="text-align: left;">
сервопривод</div>
</td> <td>1 шт</td> </tr>
</tbody></table>
</div>
<h3 style="text-align: left;">
Фото</h3>
<table align="center" border="0" style="width: 100%px;"><tbody>
<tr> <td><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJ_8Cf4dv0BshhTfQnbOKKC3J7mNZfg_5UbKo9P0nuYv8DLq_sEnqlYwYYhWQ221OK5VzEaltBm5qwmKCcDpkOeboB0Gh4ihYM0AzR-mTFJu_odOmHYVRK0zvPqtejxf-Vm0XAEcIo3uUS/s1600/SafeLock-2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJ_8Cf4dv0BshhTfQnbOKKC3J7mNZfg_5UbKo9P0nuYv8DLq_sEnqlYwYYhWQ221OK5VzEaltBm5qwmKCcDpkOeboB0Gh4ihYM0AzR-mTFJu_odOmHYVRK0zvPqtejxf-Vm0XAEcIo3uUS/s1600/SafeLock-2.jpg" height="213" width="320" /></a></td> <td><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNhwimSgrZ8fNKqYCz8qtaiG-7NMmstJcgNW34xxYs-OCi3zpE0Vx95MFdwB4jSIhISnhn0g2-n_MOFas9XCGFZeeyn6cVNism5T9Dosx3938RP1LHTXFIiYCBLWf_VuBjpmhbE-9FSCuA/s1600/SafeLock-3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNhwimSgrZ8fNKqYCz8qtaiG-7NMmstJcgNW34xxYs-OCi3zpE0Vx95MFdwB4jSIhISnhn0g2-n_MOFas9XCGFZeeyn6cVNism5T9Dosx3938RP1LHTXFIiYCBLWf_VuBjpmhbE-9FSCuA/s1600/SafeLock-3.jpg" height="213" width="320" /></a></td> </tr>
<tr> <td><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWXYWmMAA42-1VFIWaUAiTezC-fZ7SUWLTk-J4HKt1TtvzdceYiK7I6xVRfCpzS8LzjVLari1eNyiSzYHfaBWf-IXanerckXUqlsJ9m0uLsbKokoOAVeRXetcJm-u02iwNFVfemq_jHEae/s1600/SafeLock-4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWXYWmMAA42-1VFIWaUAiTezC-fZ7SUWLTk-J4HKt1TtvzdceYiK7I6xVRfCpzS8LzjVLari1eNyiSzYHfaBWf-IXanerckXUqlsJ9m0uLsbKokoOAVeRXetcJm-u02iwNFVfemq_jHEae/s1600/SafeLock-4.jpg" height="213" width="320" /></a></td> <td><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSlDZP4ysazA5PnK8WerrsPJSK8b0UWYo57RTpVQI81y30qNIRocrSvVx0-gpaVPwST9Ab7xUyfqJnm2wQVzULkHvBMM1BnqaQUA92QesLJZA5rjDlqRleMbxTnCFRCTcZmWyeOEGHB6D-/s1600/SafeLock-5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSlDZP4ysazA5PnK8WerrsPJSK8b0UWYo57RTpVQI81y30qNIRocrSvVx0-gpaVPwST9Ab7xUyfqJnm2wQVzULkHvBMM1BnqaQUA92QesLJZA5rjDlqRleMbxTnCFRCTcZmWyeOEGHB6D-/s1600/SafeLock-5.jpg" height="213" width="320" /></a></td></tr>
</tbody></table>
<br /><h3 style="text-align: left;">
Алгоритм работы</h3>
<div>
Код доступа задается статически (в планах сделать его изменяемым динамически, перепрограммировать и сохранять в постоянной памяти путем нажатия кнопки, которая доступна из "безопасной" зоны, т.е. изнутри сейфа/комнаты).</div>
<ul style="text-align: left;">
<li>ждем пока код не станет отличным от нуля, чтобы начать работу программы (считывается код из аналоговый порта A5, куда подключен резистор CleClo-Pot, и преобразовывается диапазон 0-1023 в 0-9, все это делается в подпрограмме 'ReadCode')</li>
<li>считываем код</li>
<li>полученная цифра выводится на дисплей в нужную позицию (начиная с нулевой, т.е. крайней слева)</li>
<li>зажигается или гасится точка под цифрой (каждые 1/4 секунды)</li>
<li>сравнивается предыдущая полученная цифра с текущей</li>
<ul>
<li>если совпадает, то увеличивается счетчик совпадений</li>
<li>если не совпадает, то счетчик обнуляется</li>
</ul>
<li>проверяется счетчик, если больше 30ти совпадений (примерно равно трем секундам), то код считается считанным и переходим на следующую позицию</li>
<li>когда все 4 позиции пройдены то сравниваем полученный код с эталоном</li>
<ul>
<li>если код совпадает, то:</li>
<ul>
<li>открываем замок (выводим на экран надпись 'OPEN', зажигаем светодиод на порту D13, переводим сервомотор в позицию открытия замка)</li>
<li>ждем пока резистор не переведут в позицию '0'</li>
<li>закрываем замок (выводим на экран надпись 'SHUT', гасим светодиод на порту D13, переводим сервомотор в позицию закрытия замка</li>
</ul>
<li>если код не совпадает, то выводим на экран надпись 'NOPE' (типа облом!) и ждем пока не изменится позиция резистора (для того чтоб не зацикливаться, если резистор оставили в положении отличном от нуля), начинаем все сначала.</li>
</ul>
</ul>
<h3 style="text-align: left;">
Код</h3>
<iframe allowtransparency="true" frameborder="0" src="https://codebender.cc/embed/sketch:51002" style="height: 510px; margin: 10px 0 10px; width: 100%;"></iframe><br />
<h3 style="text-align: left;">
Видео отчет</h3>
<div>
Скоро...</div>
</div>
Vasyl Yudinhttp://www.blogger.com/profile/05599352575777495536noreply@blogger.com0tag:blogger.com,1999:blog-703725759950508617.post-56037146683744986862014-09-05T22:21:00.002-07:002014-09-05T22:24:05.037-07:00Контроль работы кондиционера (замеряем температуру на входе и выходе) - Multiple temp sensor 18B20 and 7Seg display<div dir="ltr" style="text-align: left;" trbidi="on">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPs59mH_PgNdSw50dBF7G4ZxNGeQB5Ke6Paf4Ikde-3UAFPSWZ9KLs4N1svzyDueHiq6WuxY-2ae2xGbXADJ7UNVd6RC5kd74ZMk1CBaoUSZ_7tysZrowM7NoQatL7ipcdDVXwtaxvwkON/s1600/IMG_20140905_220624.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPs59mH_PgNdSw50dBF7G4ZxNGeQB5Ke6Paf4Ikde-3UAFPSWZ9KLs4N1svzyDueHiq6WuxY-2ae2xGbXADJ7UNVd6RC5kd74ZMk1CBaoUSZ_7tysZrowM7NoQatL7ipcdDVXwtaxvwkON/s1600/IMG_20140905_220624.jpg" height="213" width="320" /></a>Понадобилось мне сегодня проконтролировать работу кондиционера (возник у начальства такой вопрос). Решил для начала замерять температуры на входе (комнатная температура воздуха) и на выходе кондиционера (температура охлажденного воздуха).<br />
Для этого мне понадобилось:<br />
<ul style="text-align: left;">
<li><a href="http://blockduino.org/mediawiki/index.php?title=BlockDuino" target="_blank">Blockduino</a> - 1 шт</li>
<li><a href="http://blockduino.org/mediawiki/index.php?title=Block7Seg" target="_blank">Block7Seg</a> - 1 шт</li>
<li><a href="http://blockduino.org/mediawiki/index.php?title=TempSensor" target="_blank">CleClo-TempSensor 18b20</a> - 2 шт</li>
<li>Провода в формате <a href="http://blockduino.org/mediawiki/index.php?title=GVS" target="_blank">GVS</a></li>
<li>Блок питания на 5 вольт</li>
<li>Пару шурупов диаметром 3 мм для крепежа</li>
<li>и пол-часа времени ;)</li>
</ul>
<div>
<a name='more'></a></div>
<div>
Далее все просто:<br />
<h3 style="text-align: left;">
Сборка</h3>
</div>
<div>
<ul style="text-align: left;">
<li>Block7Seg подключаем к Blockduino</li>
<li>в разъем D10 на Block7Seg подключаем кабель</li>
<li>к нему подключаем платку CleClo-Temp18B20 без резистора</li>
<li>к нему еще один кабель</li>
<li>и к кабелю еще одну платку CleClo-Temp18B20, но уже с резистором на 4,7 кОм</li>
<li>подключаем Blockduino к программатору и заливаем код (ниже)</li>
<li>отключаем программатор и подключаем блок питания</li>
</ul>
<div>
<div style="text-align: center;">
<b><span style="font-size: large;">Всё! Устройство готово к использованию!</span></b></div>
<h3 style="text-align: left;">
<b>Фото</b></h3>
</div>
</div>
<div style="text-align: center;">
<table align="center" border="0" style="width: 100%px;"><tbody>
<tr> <td><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgq7lkdt1mhxyLYlAEYeS2cScVyqRrqZoPyCQ4Xo35-xIvZUhqHOZTtBK1_O0POTDd8_8G7VIikzgps6iI4mq_3FedByxH-K-zxXTVQOv948wt_Me-zeYwpNAk4rEEIFWxVr0BfotKDK1Z4/s1600/Multiple_18B20_n_7Segment_Diplay_2.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto; text-align: center;"><img alt="Multiple 18B20 and 7Segment Diplay" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgq7lkdt1mhxyLYlAEYeS2cScVyqRrqZoPyCQ4Xo35-xIvZUhqHOZTtBK1_O0POTDd8_8G7VIikzgps6iI4mq_3FedByxH-K-zxXTVQOv948wt_Me-zeYwpNAk4rEEIFWxVr0BfotKDK1Z4/s1600/Multiple_18B20_n_7Segment_Diplay_2.jpg" height="213" title="Multiple 18B20 and 7Segment Diplay" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Все в сборе прикрепил сбоку от кондишки</td></tr>
</tbody></table>
</td> <td><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGMkmofwWdD5gAoG-oVSGe2qa0agjacDJS2DgTjV7Z0uCRyTznKnVm6qtYGgslxXdsy0MaDXxO8YL_wUxNdRYYK4TiOxbtv8NHG0gm0K_lMnuOX3QGRefgplw9EeckV2ohrBCjRtlvPlkQ/s1600/IMG_20140905_220638.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto; text-align: center;"><img alt="Multiple 18B20 and 7Segment Diplay - Blockduino and Block7Seg" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGMkmofwWdD5gAoG-oVSGe2qa0agjacDJS2DgTjV7Z0uCRyTznKnVm6qtYGgslxXdsy0MaDXxO8YL_wUxNdRYYK4TiOxbtv8NHG0gm0K_lMnuOX3QGRefgplw9EeckV2ohrBCjRtlvPlkQ/s1600/IMG_20140905_220638.jpg" height="214" title="Multiple 18B20 and 7Segment Diplay" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Датчики подключены в разъем D10 на плате Block7Seg</td></tr>
</tbody></table>
</td> </tr>
<tr> <td><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPbNIjs8QXjOj1_EZgZpvOZ2YX168_WyF3VH65tf_AQGSGU5SZPuACQcbNLbOU1GWrd_cow4qEZKfSEZ8sdlUjc9GNdkO0GOrs0c0bIFkzsrfkvIV0CT0cHdRFF75jzY0rczHyY0_DDxf_/s1600/IMG_20140905_220645.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto; text-align: center;"><img alt="Multiple 18B20 and 7Segment Diplay - Temperature sensor 18B20 without resisitor" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPbNIjs8QXjOj1_EZgZpvOZ2YX168_WyF3VH65tf_AQGSGU5SZPuACQcbNLbOU1GWrd_cow4qEZKfSEZ8sdlUjc9GNdkO0GOrs0c0bIFkzsrfkvIV0CT0cHdRFF75jzY0rczHyY0_DDxf_/s1600/IMG_20140905_220645.jpg" height="213" title="Multiple 18B20 and 7Segment Diplay" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Промежуточный датчик без резистора - комнатная температура</td></tr>
</tbody></table>
</td> <td><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh17z8OIjZ8ZF0n0m0ktCMl0vouEOsqufI_p3jyYx1Z51BG1-ZAeS01BRDL24sxGuSgIanau_xT_HskR5RjoFPHMjJA-iHNU-fPHprxpnWuv85g_ssURfsZIwDggGWsXSfN6xblRLjJUHox/s1600/Multiple_18B20_n_7Segment_Diplay_3.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto; text-align: center;"><img alt="Multiple 18B20 and 7Segment Diplay - Temperature sensor 18B20 with resisitor" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh17z8OIjZ8ZF0n0m0ktCMl0vouEOsqufI_p3jyYx1Z51BG1-ZAeS01BRDL24sxGuSgIanau_xT_HskR5RjoFPHMjJA-iHNU-fPHprxpnWuv85g_ssURfsZIwDggGWsXSfN6xblRLjJUHox/s1600/Multiple_18B20_n_7Segment_Diplay_3.jpg" height="213" title="Multiple 18B20 and 7Segment Diplay" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Конечный (последний) датчик с резистором - температура на выходе кондишки</td></tr>
</tbody></table>
</td></tr>
</tbody></table>
</div>
<h3 style="clear: both; text-align: left;">
Код</h3>
<div>
Код взят из примера <span style="font-family: Courier New, Courier, monospace;">'Multiple'</span> библиотеки <span style="font-family: Courier New, Courier, monospace;">'DallasTemperature'</span><span style="font-family: inherit;">. Добавлены вывод температуры на дисплей блока Block7Seg поочередно с задержкой в одну секунду.</span></div>
<iframe allowtransparency="true" frameborder="0" src="https://codebender.cc/embed/sketch:47662" style="height: 510px; margin: 10px 0 10px; width: 100%;"></iframe><br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0vt6XmWxbzyHXSw7IeX6Qx80b8RJGDtPuHE2qM4QaPaE12cinkmRWC1SQvLr2_SkCa3MXS5YBSr4AwWKvwcLJExFDI7H-f8QLEX7E5agIs9U0xZjQQCA2SUQDoj8w5-j0cF2Gd9w6usR9/s1600/Multiple_18B20_n_7Segment_Diplay_1.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0vt6XmWxbzyHXSw7IeX6Qx80b8RJGDtPuHE2qM4QaPaE12cinkmRWC1SQvLr2_SkCa3MXS5YBSr4AwWKvwcLJExFDI7H-f8QLEX7E5agIs9U0xZjQQCA2SUQDoj8w5-j0cF2Gd9w6usR9/s1600/Multiple_18B20_n_7Segment_Diplay_1.jpg" height="425" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Вписалась почти органично ;)</td></tr>
</tbody></table>
</div>
Vasyl Yudinhttp://www.blogger.com/profile/05599352575777495536noreply@blogger.com0tag:blogger.com,1999:blog-703725759950508617.post-26308087590538848452014-09-02T06:42:00.000-07:002014-09-02T06:53:13.610-07:00Кодовый замок на 4х резисторах - DoorLock with 4 pot<div dir="ltr" style="text-align: left;" trbidi="on">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8mGCF9jAnIDNg3UjtaNnceZgqfw-JbBurAO7L10eDUEQOn4EmQ70Wh5dcjBgbs4O5ObSy_-4UHsE-AK3IOzb61FK36daIVYe3OGMw3dA2OCl7_x9aq_hXw6_6kO1h9l8J90FFXpN6ML-X/s1600/DoorLock_w_4_pot_1.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8mGCF9jAnIDNg3UjtaNnceZgqfw-JbBurAO7L10eDUEQOn4EmQ70Wh5dcjBgbs4O5ObSy_-4UHsE-AK3IOzb61FK36daIVYe3OGMw3dA2OCl7_x9aq_hXw6_6kO1h9l8J90FFXpN6ML-X/s1600/DoorLock_w_4_pot_1.jpg" height="150" width="200" /></a>Попытался спроектировать универсальную базу для крепежа разного вида платок в одну кучу. Что-то типа стенда.<br />
Для ее проверки решил собрать что-нить новенькое на стандартных компонентах. Выбор пал на имитацию кодового замка на камерах хранения которые стояли на ЖД вокзалах когда-то. Ну конечно же не один-в-один, а улучшенную версию :)<br />
<br />
<a name='more'></a>Для этого понадобится:<br />
<ul style="text-align: left;">
<li><a href="http://blockduino.org/mediawiki/index.php?title=BlockDuino" target="_blank">Blockduino</a> - 1 шт</li>
<li><a href="http://blockduino.org/mediawiki/index.php?title=BlockIO" target="_blank">BlockIO</a> - 1 шт</li>
<li><a href="http://blockduino.org/mediawiki/index.php?title=Pot" target="_blank">CleClo-Pot</a> - 4 шт</li>
<li><a href="http://blockduino.org/mediawiki/index.php?title=LED" target="_blank">CleClo-LED</a> - 1 шт</li>
<li><a href="http://blockduino.org/mediawiki/index.php?title=BigButton" target="_blank">CleClo-Bttn</a> - 1 шт</li>
<li><a href="http://blockduino.org/mediawiki/index.php?title=Buzzer" target="_blank">CleClo-Buzzer</a> - 1 шт</li>
<li><a href="http://blockduino.org/mediawiki/index.php?title=GVS" target="_blank">Трехжильный кабель</a> - 7 шт</li>
</ul>
Ну и в качестве привода открытия замка - сервопривод.<br />
<div style="text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8mGCF9jAnIDNg3UjtaNnceZgqfw-JbBurAO7L10eDUEQOn4EmQ70Wh5dcjBgbs4O5ObSy_-4UHsE-AK3IOzb61FK36daIVYe3OGMw3dA2OCl7_x9aq_hXw6_6kO1h9l8J90FFXpN6ML-X/s1600/DoorLock_w_4_pot_1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8mGCF9jAnIDNg3UjtaNnceZgqfw-JbBurAO7L10eDUEQOn4EmQ70Wh5dcjBgbs4O5ObSy_-4UHsE-AK3IOzb61FK36daIVYe3OGMw3dA2OCl7_x9aq_hXw6_6kO1h9l8J90FFXpN6ML-X/s1600/DoorLock_w_4_pot_1.jpg" height="480" width="640" /></a></div>
</div>
<table align="center" border="0" style="width: 100%px;"><tbody>
<tr> <td><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgr95lmqicomsXzFZIge1vln6zSegNIYHyG-x0z1nz4e3ttRsL2CNYYBbF6z1bL3SEzPL79Rb7lxdmMvfrJrCMeEF1QzImAqC7FAGMaxpnTnqmyZ88Px9R5Z9oL2zBiEvcywcjaUkAxG4PV/s1600/DoorLock_w_4_pot_2.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgr95lmqicomsXzFZIge1vln6zSegNIYHyG-x0z1nz4e3ttRsL2CNYYBbF6z1bL3SEzPL79Rb7lxdmMvfrJrCMeEF1QzImAqC7FAGMaxpnTnqmyZ88Px9R5Z9oL2zBiEvcywcjaUkAxG4PV/s1600/DoorLock_w_4_pot_2.jpg" height="213" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Четыре переменных резистора для ввода четырёхзначного кода доступа</td></tr>
</tbody></table>
</td> <td><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9fSi0nyZDYmBimFIx1TUREY13jk9a-w_8hicv1IB3EaEcNUbTgW7NdQZjEfmVhA7bocO6dBEiLQ7ARiVJaAU0f1HVhGJ_ntwgU3TKtf-a5j9lDZCRH07ykQcwgPtZf2b6YGLDIzlCtzLQ/s1600/DoorLock_w_4_pot_3.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9fSi0nyZDYmBimFIx1TUREY13jk9a-w_8hicv1IB3EaEcNUbTgW7NdQZjEfmVhA7bocO6dBEiLQ7ARiVJaAU0f1HVhGJ_ntwgU3TKtf-a5j9lDZCRH07ykQcwgPtZf2b6YGLDIzlCtzLQ/s1600/DoorLock_w_4_pot_3.jpg" height="213" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Так как сервомотор нужен только для индикации, то он подключается непосредственно в порт</td></tr>
</tbody></table>
</td> </tr>
<tr> <td><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBBtaTMbqs7m6vxlG9wgGoRbMZwLRCM2LDegYLEBFsQKxUf0nw2IaUKYy8EaePUsslNIRlxnyiJj42cbcWxU1ayDA8pjNUl2hs7mybwXmU8iuYDMWXov-xAujXJcwrqcliLeAw26GvD-ef/s1600/DoorLock_w_4_pot_4.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBBtaTMbqs7m6vxlG9wgGoRbMZwLRCM2LDegYLEBFsQKxUf0nw2IaUKYy8EaePUsslNIRlxnyiJj42cbcWxU1ayDA8pjNUl2hs7mybwXmU8iuYDMWXov-xAujXJcwrqcliLeAw26GvD-ef/s1600/DoorLock_w_4_pot_4.jpg" height="213" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Светодиод нужен для индикации открытия замка, кнопка - для сброса и ввода нового кода</td></tr>
</tbody></table>
</td> <td><br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhDSjDPjxZbus2JDEwV4_wKZQrwSXsjKBiYrbW_QwXTJEbAb8OekWbpZqV_VhVhVjq1hIAjzRQKOovUR9FFQKw2u5duQi4UGJkHCgEG78JDSdT2TiRvooJ0VBdUVqcLBEFibY036dyM1X4/s1600/DoorLock_w_4_pot_5.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhDSjDPjxZbus2JDEwV4_wKZQrwSXsjKBiYrbW_QwXTJEbAb8OekWbpZqV_VhVhVjq1hIAjzRQKOovUR9FFQKw2u5duQi4UGJkHCgEG78JDSdT2TiRvooJ0VBdUVqcLBEFibY036dyM1X4/s1600/DoorLock_w_4_pot_5.jpg" height="213" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Все это подключается в плату BlockIO, которая в свою очередь подсоединяется к Blockduino</td></tr>
</tbody></table>
</td> </tr>
</tbody></table>
Принцип работы прост. Код доступа задается статически (в планах сделать его изменяемым динамически, перепрограммировать и сохранять в постоянной памяти путем нажатия кнопки, которая доступна из "безопасной" зоны, т.е. изнутри сейфа/комнаты).<br />
Далее:<br />
<br />
<ul style="text-align: left;">
<li>система проверяет установку резисторов, если они все в "нуле", то ждем и начинаем все сначала</li>
<li>иначе (если есть какой-то код) подаем коротенький сигнал (баззером и светодиодом) и сверяем код доступа с эталоном</li>
<li>если код доступа не совпадает начинаем все сначала</li>
<li>иначе (код правильный) начинаем активно сигналить и ждем обнуления кодовых резисторов (защита от дурака, чтоб не оставлять код на резисторах)</li>
<li>когда резисторы обнулили переводим замок в положение открыто на пару секунд (с соответствующим сигналом) и возвращаем все в исходное положение</li>
<li>начинаем все сначала</li>
</ul>
<div style="text-align: center;">
<iframe allowtransparency="true" frameborder="0" src="https://codebender.cc/embed/sketch:46314" style="height: 510px; margin: 10px 0 10px; width: 100%;"></iframe><br /></div>
</div>
Vasyl Yudinhttp://www.blogger.com/profile/05599352575777495536noreply@blogger.com0tag:blogger.com,1999:blog-703725759950508617.post-57196391038287104692014-08-17T21:28:00.000-07:002014-09-02T06:53:35.624-07:00Магический Шар или Ардуино предсказывает будущее (Arduino Magic Ball)<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<div class="" style="clear: both; text-align: center;">
<span style="text-align: left;"></span></div>
<div style="text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKI4Wc6REwLrCsbFTl2Fo1_kcJIIdDJCyfHaZyq3SFUfZBgGvuZ4RShpOOWs83EVCiSw-Kxv2eU79w8YeiQD5j-Nj7-LEX3-_a3TfwWFmhLsvAMoEwKsTiCPXWg-L7bWrey6X9prNk5aWN/s1600/Arduino_Magic_Ball_2.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKI4Wc6REwLrCsbFTl2Fo1_kcJIIdDJCyfHaZyq3SFUfZBgGvuZ4RShpOOWs83EVCiSw-Kxv2eU79w8YeiQD5j-Nj7-LEX3-_a3TfwWFmhLsvAMoEwKsTiCPXWg-L7bWrey6X9prNk5aWN/s1600/Arduino_Magic_Ball_2.jpg" height="212" width="320" /></a><span style="text-align: left;">На днях, по многочисленным просьбам <strike>трудящихся</strike> ардуинопользователей, починил барахлившую библиотеку для вывода кириллицы на ЖК экранчики подключенные по IIC протоколу.</span></div>
<br />
В связи с этим захотелось что-то сделать с ее участием и решил реализовать давно витавшую в мозгах идею о Шаре Предсказателе, т.е. в нашем случае об Ардуино Предсказателе Будущего.<br />
<br />
<a name='more'></a>Для этого понадобятся:<br />
<br />
<ul style="text-align: left;">
<li>Ардуино</li>
<li>ЖК экран (у меня подключенный по протоколу IIC)</li>
<li>Акселерометр (у меня <a href="https://www.sparkfun.com/short/9757" target="_blank">LSM303DLH от SparkFun</a>)</li>
</ul>
<div>
Или как в моем варианте:</div>
<div>
<ul style="text-align: left;">
<li><a href="http://blockduino.org/mediawiki/index.php?title=BlockDuino" target="_blank">Blockduino</a></li>
<li><a href="http://blockduino.org/mediawiki/index.php?title=BlockLCD0802_IC" target="_blank">BlockLCD0802_IC</a></li>
<li><a href="https://www.sparkfun.com/short/9757" target="_blank">LSM303DLH от SparkFun</a></li>
</ul>
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNfaKI9UscL5k0SPVtlMg70XM_SFv6ovclVZp3dokUaV2jnsFHAl5aS8KgKRyxjFQWVlAyz_P7BgxsNi01pVwEAgswzi78ym16zwBB4xGa8uMxu5z-5dfZqXdZZ3BJY8qqfvaQQG6vSowj/s1600/Arduino_Magic_Ball_1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNfaKI9UscL5k0SPVtlMg70XM_SFv6ovclVZp3dokUaV2jnsFHAl5aS8KgKRyxjFQWVlAyz_P7BgxsNi01pVwEAgswzi78ym16zwBB4xGa8uMxu5z-5dfZqXdZZ3BJY8qqfvaQQG6vSowj/s1600/Arduino_Magic_Ball_1.jpg" height="266" width="400" /></a></div>
Далее все просто, экран (BlockLCD0802_IC) подключаем к ардуино (Blockduino), затем подсоединяем плату с акселерометром (GND к земле, Vin к +5V, SCL к A5, а SDA к A4) и загружаем код:<br />
<iframe allowtransparency="true" frameborder="0" src="https://codebender.cc/embed/sketch:44226" style="height: 510px; margin: 10px 0 10px; width: 100%;"></iframe><br />
Сразу предупрежу, что код - это только первичная рабочая наброска. Позже буду допиливать и усовершенствовать.<br />
Принцип работы кода:<br />
<ul style="text-align: left;">
<li>Замеряем показания акселерометра по всем трем осям, отфильтровываем и суммируем.</li>
<li>Определяем максимум и минимум для предыдущих показателей и разницу между ними</li>
<li>Увеличиваем минимум и уменьшаем максимум на определенную величину (т.е. уменьшаем между ними разницу)</li>
<li>Если разница практически ноль, т.е. ардуино никто больше не трясет, то выбираем случайное число до 20ти и выводим соответствующую надпись на экран.</li>
<li>Если же разница больше какой-то величины (ардуино сильно встряхнули), то стираем предыдущую надпись.</li>
<li>Начинаем все сначала :)</li>
</ul>
<div>
Варианты ответа взяты из статьи в википедии "<a href="http://ru.wikipedia.org/wiki/Magic_8_ball" target="_blank">Magic 8 ball</a>"</div>
<div>
<br /></div>
<div>
ToDo:</div>
<div>
<ul style="text-align: left;">
<li>Добавить возможность выбора различных наборов ответов: английский, русский-весёлый, русский-гоблин, и т.д.</li>
<li>Выводить текст на экран не сразу весь, а побуквенно, т.е. сымитировать ввод текста с клавиатуры.</li>
</ul>
</div>
</div>
Vasyl Yudinhttp://www.blogger.com/profile/05599352575777495536noreply@blogger.com0Соединенные Штаты Америки29.723826212890273 -88.56711352812499229.283290712890274 -89.212560528125 30.164361712890273 -87.921666528124987tag:blogger.com,1999:blog-703725759950508617.post-67779432640256961562014-08-01T18:13:00.000-07:002014-09-02T06:53:22.483-07:00IR Rider w Any IRremote - Управляем роботом с помощью любого ИК пульта<div dir="ltr" style="text-align: left;" trbidi="on"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3QfkS7z6IMcbjstZy6dS-RUEZdSR6aOsLwKhmts8m11i_CoAvliHF3bruFuOB9he4Ej5ae70RbH1rbjRt24mzc4df7Sm36ZJzWnlZdOTU3QC7-h13N8dWPfeL5SzCDIA1nCQ1Gc4MmQfq/s1600/IR+Rider+w+Any+IRremote+-+Lot+of+IR.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3QfkS7z6IMcbjstZy6dS-RUEZdSR6aOsLwKhmts8m11i_CoAvliHF3bruFuOB9he4Ej5ae70RbH1rbjRt24mzc4df7Sm36ZJzWnlZdOTU3QC7-h13N8dWPfeL5SzCDIA1nCQ1Gc4MmQfq/s1600/IR+Rider+w+Any+IRremote+-+Lot+of+IR.jpg" height="150" width="200" /></a></div><br />
<br />
Снова я вне дома, снова без семьи, и-нета, друзей и телевизора. А это значит, что нужно чем-то заполнять пустоту в мозгах.<br />
Достал из чемодана своего <a href="http://blockduino.blogspot.ca/2013/11/ir-rider-updated.html" target="_blank">IR-Rider</a>'а, а пульт, под который он был запрограммирован, остался где-то там где я тогда работал. Тут же возникла мысль запрограммировать его для обучения "на лету" под любой пульт.<br />
<br />
<a name='more'></a><br />
И если в <a href="http://blockduino.blogspot.ca/2013/08/blog-post.html" target="_blank">прошлый раз</a> я использовал девять кнопок пульта, чтобы реализовать движение в разных направлениях:<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioN0-_TwTeLj5NtinnJ3y-fpDQqFYzkTXCjIDdHqpwMhaRndO3N_VILYoFk7z_HS2jNC8WhxQ2KXErODri86XlStFAlWmbUrVNK_SNRuzm2Qz7HAibvAQzl7xCfqx9VhhZRbTyd9JNi1yk/s1600/IR_Rider_7.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioN0-_TwTeLj5NtinnJ3y-fpDQqFYzkTXCjIDdHqpwMhaRndO3N_VILYoFk7z_HS2jNC8WhxQ2KXErODri86XlStFAlWmbUrVNK_SNRuzm2Qz7HAibvAQzl7xCfqx9VhhZRbTyd9JNi1yk/s1600/IR_Rider_7.jpg" height="267" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Надписи обозначают движение робота при нажатии на кнопки</td></tr>
</tbody></table><br />
то сейчас, для удобства перепрограммирования я решил реализовать все эти движения с помощью только пяти кнопок:<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw0U5mcgOYYfEYjzou3hENSZ7eUXHQxNpWodBJVih_8uInubeqy7h-RpEeoJEhPEChWHYbtuOhGNDcQ6_vZvd-MrfYD5MZd_jeDUJWFrcR4TmOsnZgqyLAEFAsOGmwmuCTQS90erYGI5Q0/s1600/Describe+8+Directions+for+4+Buttons.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw0U5mcgOYYfEYjzou3hENSZ7eUXHQxNpWodBJVih_8uInubeqy7h-RpEeoJEhPEChWHYbtuOhGNDcQ6_vZvd-MrfYD5MZd_jeDUJWFrcR4TmOsnZgqyLAEFAsOGmwmuCTQS90erYGI5Q0/s1600/Describe+8+Directions+for+4+Buttons.jpg" height="300" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Заглавные слова обозначают соответствующую кнопку на пульте</td></tr>
</tbody></table>Т.е. если с положения СТОП, нажать кнопку ВЛЕВО, то робот будет разворачиваться на месте. Если с положения СТОП нажать ВПЕРЕД, то поедет вперед (спасибо кэп очевидность!!!), но если при движении вперед нажать еще кнопку ВЛЕВО, то робот начнет подворачивать по дуге влево, т.е. по направлению ВПЕРЕД и ВЛЕВО.<br />
Работа алгоритма примерно следующая:<br />
При подаче питания пару секунд моргает светодиод D13, и система ждет нажатия кнопки на ИК пульте. Если в это время нажать кнопку (жать нужно кнопку СТОП), то система перейдет в режим перепрограммирования, светодиод перестанет моргать и робот сделает короткий рывок в перед. Перед каждым нажатием робот делает рывок в соответствующем направлении.<br />
Затем нужно последовательно нажать кнопки: ВПЕРЕД, НАПРАВО, НАЗАД, НАЛЕВО.<br />
После нажатия последней кнопки, робот делает движение вперед-назад.<br />
Робот готов к работе.<br />
Проверяем соответствие кнопок и движения робота, и, если все устраивает, нажимаем ПЯТЬ раз подряд кнопку СТОП. Коды кнопок записываются в постоянную память микроконтроллера.<br />
Если при подаче питания (или после сброса) подождать пару секунд и не нажимать кнопки на пульте, то коды кнопок загружаются из постоянной памяти.<br />
Код:<br />
<iframe allowtransparency="true" frameborder="0" src="https://codebender.cc/embed/sketch:41168" style="height: 510px; margin: 10px 0 10px; width: 100%;"></iframe><br />
</div>Vasyl Yudinhttp://www.blogger.com/profile/05599352575777495536noreply@blogger.com0Олдс Ков, Новая Шотландия B0H, Канада45.65 -61.44999999999998920.1279655 -102.75859399999999 71.1720345 -20.141405999999989tag:blogger.com,1999:blog-703725759950508617.post-47272252480926232342014-04-01T10:50:00.000-07:002015-06-09T07:47:02.602-07:00Библиотека для блока Block7Seg или Выводим текст на семисегментный светодиодный дисплей<div dir="ltr" style="text-align: left;" trbidi="on">
<h4 style="text-align: left;">
Вступление</h4>
Повозившись со существующими библиотеками найденными в сети, понял, что не все так гладко как хотелось.<br />
Во первых, еле нашел библиотеку, которая работает по прерываниям (<a href="https://www.google.com/search?q=Multiplex7Seg" target="_blank">Multiplex7Seg</a>), что дает возможность в основном теле нашей программы заниматься своими делами, а не прорисовывать числа на дисплеях. Ведь без прерывания при обращении к датчику температуры 18B20 дисплей зависает на одной цифре почти на секунду.<br />
Во вторых, та же библиотека как-то коряво выводит числа на дисплей, каким-то хитрым путем прорисовывает точку в дробных числах. И никакой реализации, чтобы вывести что-то больше. А хочется.<br />
В общем взяв эту библиотеку и взяв на вооружение опыт полученный при написании библиотеки для светодиодного дисплея на микросхеме TM1628 и ее части (библиотеки конечно же) я, промудахавшись пару дней, получил нужное.<br />
Итак, прошу любить и жаловать, библиотека для вывода текста на светодиодный семисегментный индикатор подключенный напрямую к микроконтроллеру:<a href="https://drive.google.com/file/d/0BwbPR-ixqjcZcmh4RFRVa1lQTjQ/edit?usp=sharing" target="_blank"> lib_Block7Seg</a>.<br />
<br />
<a name='more'></a><br />
<h4>
UPDATE!!!</h4>
<h4>
<div style="font-weight: normal;">
Библиотека была полностью переработана и доработана!!!<br />
Больше инфо и ссылки на скачивание на <a href="http://blockduino.blogspot.com/2015/06/libblock7seg-printto7seg.html">Тотальное обновление библиотеки lib_Block7Seg, она же PrintTo7Seg</a></div>
</h4>
<h4 style="text-align: left;">
Описание</h4>
Позволяет с помощью функции <span style="color: #cc6600;">print</span>() выводить любую текстовую информацию в нужном виде.<br />
Т.е. можно задавать количество выводимых цифр после точки и прочее:<br />
Вот модифицированный пример из <span style="font-family: Courier New, Courier, monospace;">Reference</span> для <span style="font-family: Courier New, Courier, monospace;">Print </span>(см пример <span style="font-family: Courier New, Courier, monospace;">Print_Demo</span>):<br />
<blockquote class="tr_bq">
<pre> Seg7.<span style="color: #cc6600;">print</span>(78, <span style="color: #006699;">BIN</span>); <span style="color: #7e7e7e;">// выводит "1001110"</span>
Seg7.<span style="color: #cc6600;">print</span>(78, <span style="color: #006699;">OCT</span>); <span style="color: #7e7e7e;">// выводит "116"</span>
Seg7.<span style="color: #cc6600;">print</span>(78, <span style="color: #006699;">DEC</span>); <span style="color: #7e7e7e;">// выводит "78"</span>
Seg7.<span style="color: #cc6600;">print</span>(78, <span style="color: #006699;">HEX</span>); <span style="color: #7e7e7e;">// выводит "4E"</span>
Seg7.<span style="color: #cc6600;">print</span>(1.23456, 0); <span style="color: #7e7e7e;">// выводит "1"</span>
Seg7.<span style="color: #cc6600;">print</span>(1.23456, 1); <span style="color: #7e7e7e;">// выводит "1.2"</span>
Seg7.<span style="color: #cc6600;">print</span>(1.23456, 3); <span style="color: #7e7e7e;">// выводит "1.234"</span>
Seg7.<span style="color: #cc6600;">print</span>(<span style="color: #006699;">"b.ino"</span>); <span style="color: #7e7e7e;">// выводит "b.ino"</span>
</pre>
</blockquote>
Как видите, открываются интересные возможности.<br />
Кроме того есть дополнительные функции:<br />
<pre>Seg7.<span style="color: #cc6600;">clear</span>(); - очистка дисплея</pre>
<span style="font-family: monospace; white-space: pre;">Seg7.</span><span style="color: #cc6600; font-family: monospace; white-space: pre;">ml</span><span style="font-family: monospace; white-space: pre;">(); - сдвиг содержимого дисплея на одну позицию влево</span><br />
<div>
<span style="font-family: monospace; white-space: pre;">Seg7.</span><span style="color: #cc6600; font-family: monospace; white-space: pre;">mr</span><span style="font-family: monospace; white-space: pre;">(); - </span><span style="font-family: monospace; white-space: pre;">сдвиг содержимого дисплея на одну позицию вправо</span></div>
<span style="font-family: monospace; white-space: pre;">Seg7.<span style="color: #cc6600;">setChar</span></span><span style="font-family: monospace; white-space: pre;">(pos, char); - вывод символа в нужную ячейку (0 - крайняя слева)</span><br />
<h4 style="text-align: left;">
Особенности</h4>
Есть небольшие особенности работы с этой библиотекой. Процедура вывода информации такова: символ помещается в крайнюю правую ячейку, при выводе очередного символа предыдущий смещается влево. Т.е. при выводе 5ти символов на четырех числовой дисплей первый символ выйдет за пределы, т.е. не будет отображаться. Но зато при последовательном выводе символов с небольшой задержкой можно легко реализовать бегущую строку (см. пример в библиотеке <span style="font-family: Courier New, Courier, monospace;">Rinning_Text</span>).<br />
Конечно, нужно понимать, что на семи сегментах невозможно прорисовать полноценный текст, к тому же всего на 4х индикаторах. Но тем не менее без проблем можно вывести короткие сообщения типа: <span style="font-family: Courier New, Courier, monospace;">Set, Test, Err, Load, Shut, Open, Stop, Cool, Heat</span>.<br />
Кстати, шрифт прописан от 32го символа (пробел) до 126го (тильда), т.е. русского шрифта нет, да и многие символы прорисовываются чисто символически (извините за тавтологию)))<br />
Нужно еще обратить внимание на точку, т.к. она прорисовывается не в основном поле, а под ним, то при выводе точки смещения символов не происходит. А значит троеточие будет выводится в одну точку, но это решается вставкой пробелов между точками, как это сделано в примере.<br />
<h4 style="text-align: left;">
Порта / пины</h4>
Пины подключения прописываются в библиотеке (в файле lib_Block7Seg.cpp):<br />
<blockquote class="tr_bq">
<pre><span style="color: #7e7e7e;">// digitPins - LSB to MSB, segmentPins - a to g, Dp</span>
<span style="color: #cc6600;">byte</span> digitPins[4] = { 3, 7, 8, A0 };
<span style="color: #cc6600;">byte</span> segmentPins[8] = { 4, 9, A2, A3, 2, 5, A1, 6};
</pre>
</blockquote>
Можно смело прописывать свои порта.<br />
<h4 style="text-align: left;">
Общий катод / анод</h4>
Для подключения дисплеев с общим катодом (или анодом... чего-то я запутался...) нужно раскомментировать:<br />
<blockquote class="tr_bq">
<pre>bool LLOW = <span style="color: #006699;">LOW</span>;
bool HHIGH = <span style="color: #006699;">HIGH</span>;
<span style="color: #7e7e7e;">// bool LLOW = HIGH;</span>
<span style="color: #7e7e7e;">// bool HHIGH = LOW;</span>
</pre>
</blockquote>
<h4 style="text-align: left;">
Заключение</h4>
В общем такая вот интересная и универсальная библиотечка вышла, пользуйтесь в свое удовольствие и делитесь впечатлениями и замечаниями.<br />
<h4 style="text-align: left;">
Фото / видео</h4>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTjXCJV7wtNFUoJOhKcodtPKDqM4M9Hp1gvG6H3eMqCdYcaWLrpqQ7uc63xgHZKhOIzUVAkxBD_2K0TSPozz7MrtejF-FT6YbWfdJzWIZNlAh1lZtO5YgYDMA8D5Do_gi8IwJgpRnnQJUJ/s1600/IMG_20140319_185544.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTjXCJV7wtNFUoJOhKcodtPKDqM4M9Hp1gvG6H3eMqCdYcaWLrpqQ7uc63xgHZKhOIzUVAkxBD_2K0TSPozz7MrtejF-FT6YbWfdJzWIZNlAh1lZtO5YgYDMA8D5Do_gi8IwJgpRnnQJUJ/s320/IMG_20140319_185544.jpg" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/VfpA5RxnCQY?feature=player_embedded' frameborder='0'></iframe></div>
</div>
<h4 style="text-align: left;">
Ссылки</h4>
Ссылка на библиотеку: <a href="https://drive.google.com/file/d/0BwbPR-ixqjcZcmh4RFRVa1lQTjQ/edit?usp=sharing" target="_blank">lib_Block7Seg</a>
<br />
<h4 style="text-align: left;">
UPDATE!!!</h4>
Библиотека была полностью переработана и доработана!!!<br />
Больше инфо и ссылки на скачивание на <a href="http://blockduino.blogspot.com/2015/06/libblock7seg-printto7seg.html">Тотальное обновление библиотеки lib_Block7Seg, она же PrintTo7Seg</a></div>
Vasyl Yudinhttp://www.blogger.com/profile/05599352575777495536noreply@blogger.com0tag:blogger.com,1999:blog-703725759950508617.post-76046397594195852832014-03-21T16:08:00.000-07:002014-08-02T21:00:22.633-07:00Русифицированная библиотека LiquidCristal_I2C - Updated LiquidCrystalCyr_I2C<div dir="ltr" style="text-align: left;" trbidi="on">
Я для блока LCD0802_IC русифицировал библиотеку LiquidCristal_I2C.<br />
<div>
Вернее я объединил две библиотеки: LiquidCristal_I2C и LiquidCristalRus (c сайта <a href="http://mk90.ru/">mk90.ru</a>). Правильно было бы назвать ее LiquidCristalRus_I2C, но назвал ее <a href="https://googledrive.com/host/0BwbPR-ixqjcZTUhNeGJnZTF4U3c/lib_BlockLCD0802_IC.zip" target="_blank">lib_BlockLCD0802_IC</a>, чтоб было сразу понятно для какого блока она предназначена. Но она работает и с другими производителями (например DFRobot).<br />
Вот пример скетча на два дисплея:<br />
<br />
<a name='more'></a><br />
<pre><blockquote class="tr_bq">
#include <<span style="color: #cc6600;">Wire</span>.h>
#include <lib_blocklcd0802_ic .h=""><lib_blocklcd0802_ic .h=""><lib_blocklcd0802_ic .h="">
lib_BlockLCD0802_IC lcd1(0x3F,8,2);
lib_BlockLCD0802_IC lcd2(0x3D,8,2);
<span style="color: #cc6600;">void</span> <span style="color: #cc6600;"><b>setup</b></span>()
{
lcd1.<span style="color: #cc6600;">init</span>();
lcd2.<span style="color: #cc6600;">init</span>();
lcd2.<span style="color: #cc6600;">backlight</span>();
lcd1.<span style="color: #cc6600;">print</span>(<span style="color: #006699;">"Миру"</span>);
lcd1.<span style="color: #cc6600;">setCursor</span>(0, 1);
lcd1.<span style="color: #cc6600;">print</span>(<span style="color: #006699;">" МИР"</span>);
lcd2.<span style="color: #cc6600;">print</span>(<span style="color: #006699;">"Риму"</span>);
lcd2.<span style="color: #cc6600;">setCursor</span>(0, 1);
lcd2.<span style="color: #cc6600;">print</span>(<span style="color: #006699;">" РИМ"</span>);
<span style="color: #cc6600;">delay</span>(5000);
lcd1.<span style="color: #cc6600;">home</span>();
lcd2.<span style="color: #cc6600;">home</span>();
}</lib_blocklcd0802_ic></lib_blocklcd0802_ic></lib_blocklcd0802_ic></blockquote>
<blockquote class="tr_bq">
<span style="color: #cc6600;">void</span> <span style="color: #cc6600;"><b>loop</b></span>()
{
lcd1.<span style="color: #cc6600;">print</span>(<span style="color: #006699;">"АБВГДЕЁЖ"</span>);
lcd1.<span style="color: #cc6600;">setCursor</span>(0, 1);
lcd1.<span style="color: #cc6600;">print</span>(<span style="color: #006699;">"ЗИЙКЛМНО"</span>);
lcd2.<span style="color: #cc6600;">print</span>(<span style="color: #006699;">"ПРСТУФХЦ"</span>);
lcd2.<span style="color: #cc6600;">setCursor</span>(0, 1);
lcd2.<span style="color: #cc6600;">print</span>(<span style="color: #006699;">"ЧШЩЪЫЬЭЮ"</span>);
<span style="color: #cc6600;">delay</span>(3000);
lcd1.<span style="color: #cc6600;">clear</span>();
lcd2.<span style="color: #cc6600;">clear</span>();
lcd1.<span style="color: #cc6600;">print</span>(<span style="color: #006699;">"абвгдеёж"</span>);
lcd1.<span style="color: #cc6600;">setCursor</span>(0, 1);
lcd1.<span style="color: #cc6600;">print</span>(<span style="color: #006699;">"зийклмно"</span>);
lcd2.<span style="color: #cc6600;">print</span>(<span style="color: #006699;">"прстуфхц"</span>);
lcd2.<span style="color: #cc6600;">setCursor</span>(0, 1);
lcd2.<span style="color: #cc6600;">print</span>(<span style="color: #006699;">"чшщъыьэю"</span>);
<span style="color: #cc6600;">delay</span>(3000);
lcd1.<span style="color: #cc6600;">clear</span>();
lcd2.<span style="color: #cc6600;">clear</span>();
lcd1.<span style="color: #cc6600;">print</span>(<span style="color: #006699;">"ЯЯЯЯЯЯЯЯ"</span>);
lcd2.<span style="color: #cc6600;">setCursor</span>(0, 1);
lcd2.<span style="color: #cc6600;">print</span>(<span style="color: #006699;">"яяяяяяяя"</span>);
<span style="color: #cc6600;">delay</span>(3000);
lcd1.<span style="color: #cc6600;">clear</span>();
lcd2.<span style="color: #cc6600;">clear</span>();
}</blockquote>
</pre>
Ну и фото пруф:</div>
<table align="center" border="0" style="width: 100%px;"><tbody>
<tr> <td><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiT05oCKZcBbqIqx8vGR2f8fDH5Jy4B0ebsN5d3V8vx0FKxN9XcAgU1rXDnqhzVjc08Y3RS0t7vJ4817YT6fHT2sf0RCz9sI7VAX7ilmxH-1NGa8Yct8FysaYfRh-w6M0IysZUiIk6HQWhB/s1600/BlockLCD0802_IC_2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br />
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiT05oCKZcBbqIqx8vGR2f8fDH5Jy4B0ebsN5d3V8vx0FKxN9XcAgU1rXDnqhzVjc08Y3RS0t7vJ4817YT6fHT2sf0RCz9sI7VAX7ilmxH-1NGa8Yct8FysaYfRh-w6M0IysZUiIk6HQWhB/s1600/BlockLCD0802_IC_2.jpg" height="213" width="320" /></a></div>
</td> <td><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqje-Kq2TAcplj3BOa9ZwFaPtBbVSc9-W_TLEiJDFodS-WXDFrHSbQfDd7Vhrkg7HY8cBq3_DVuVJk-CLvorbo3Vtf3oYtiCJ1RVkSTQIfep7Lq002w8YUFoRPgMPAFFmopbaKR6SAyGkc/s1600/BlockLCD0802_IC_1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br />
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqje-Kq2TAcplj3BOa9ZwFaPtBbVSc9-W_TLEiJDFodS-WXDFrHSbQfDd7Vhrkg7HY8cBq3_DVuVJk-CLvorbo3Vtf3oYtiCJ1RVkSTQIfep7Lq002w8YUFoRPgMPAFFmopbaKR6SAyGkc/s1600/BlockLCD0802_IC_1.jpg" height="213" width="320" /></a></div>
</td> </tr>
</tbody></table>
<br />
Ссылка на библиотеку: <a href="https://googledrive.com/host/0BwbPR-ixqjcZTUhNeGJnZTF4U3c/lib_BlockLCD0802_IC.zip" target="_blank">lib_BlockLCD0802_IC</a> или <a href="http://blockduino.org/BD_libs/lib_BlockLCD0802_IC.zip" target="_blank">lib_BlockLCD0802_IC</a><br />
UPD: или та же библиотека, но под более 'правильным' названием: <a href="http://blockduino.org/Libs/LiquidCrystalCyr_I2C.zip" target="_blank">LiquidCrystalCyr_I2C.zip</a></div>
Vasyl Yudinhttp://www.blogger.com/profile/05599352575777495536noreply@blogger.com0tag:blogger.com,1999:blog-703725759950508617.post-48611160018014595952013-10-24T16:55:00.001-07:002013-10-24T17:04:42.596-07:00Line Rider Railway - Железная дорога из бумаги для робота <div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
</div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHzOcmSGiVvlGOpPNKqXN8pQvGhAHLo5Qv7BfmbfPl-TYg5ZLzClNSpUFp_B_Iyp3Nfx8p8sRQWHEDLzd51hUQWqtcummf56fnGae_8LHUf5IczmaOTtYz7Qi3BRMx3fmnSILTVPy5Grgf/s1600/Line-Rider-Track.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img alt="Робот едущий по линии" border="0" height="132" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHzOcmSGiVvlGOpPNKqXN8pQvGhAHLo5Qv7BfmbfPl-TYg5ZLzClNSpUFp_B_Iyp3Nfx8p8sRQWHEDLzd51hUQWqtcummf56fnGae_8LHUf5IczmaOTtYz7Qi3BRMx3fmnSILTVPy5Grgf/s200/Line-Rider-Track.jpg" title="Робот едущий по линии" width="200" /></a>В продолжение статьи '<a href="http://blockduino.blogspot.co.uk/2013/09/line-rider-1_25.html">Робот бегущий по линии, с одним датчиком - Line Rider 1</a>'<br />
<br />
Исправил проблему с потерей линии. Теперь робот, съехав с линии, поворачивается на небольшую величину в заданную сторону и не найдя линии поворачивается в другую на чуть большую величину, и так далее.<br />
Основное тело программы выглядит так:<br />
<blockquote class="tr_bq">
<pre><span style="color: #cc6600;">void</span> <span style="color: #cc6600;"><b>loop</b></span>() { <span style="color: #7e7e7e;">// Основное тело программы</span>
<span style="color: #cc6600;">if</span>(isLine()) { <span style="color: #7e7e7e;">// если под нами линия</span>
<span style="color: #cc6600;">digitalWrite</span>(LED_PIN, <span style="color: #006699;">LOW</span>); <span style="color: #7e7e7e;">// гасим индикаторный светодиод</span>
counter = 3; <span style="color: #7e7e7e;">// сбрасываем счетчик</span>
Run(); <span style="color: #7e7e7e;">// едем вперед</span>
} <span style="color: #cc6600;">else</span> { <span style="color: #7e7e7e;">// иначе (нет под нами линии)</span>
<span style="color: #cc6600;">digitalWrite</span>(LED_PIN, <span style="color: #006699;">HIGH</span>); <span style="color: #7e7e7e;">// включаем индикаторный светодиод</span>
Rotation(MIN_ROT); <span style="color: #7e7e7e;">// поворачиваем на минимальную величину</span>
<span style="color: #cc6600;">if</span>(!isLine()) { <span style="color: #7e7e7e;">// смотрим снова, если под нами нет линии (знак '!' - знак отрицания)</span>
isCW=!isCW; <span style="color: #7e7e7e;">// меняем направление поворота</span>
Rotation(MIN_ROT * counter); <span style="color: #7e7e7e;">// поворачиваем на несколько (зависит от количества попыток) минимальных величин</span>
counter= counter + 4; <span style="color: #7e7e7e;">// увеличиваем счетчик попыток</span>
}
}
} <span style="color: #7e7e7e;">// конец основной программы, начинаем все сначала</span>
</pre>
</blockquote>
Обратите внимание, что добавилась переменная <br />
<blockquote class="tr_bq">
<pre><span style="color: #cc6600;">int</span> counter;
</pre>
</blockquote>
Для проверки работоспособности собрал небольшую трассу с резкими поворотами и прямыми углами. Тест показал неплохую работоспособность, за исключением небольшого но: на очередном повороте робот потеряв линию проскочил ее снова и начал раскачиваться вокруг своей вертикальной оси. А все потому, что наличие линии определяется только в конечных точках. В общем нашел он ее только развернувшись в обратную сторону. Вот видео:<br />
<a name='more'></a><br />
<div style="text-align: center;">
<iframe allowfullscreen="" frameborder="0" height="360" src="//www.youtube.com/embed/MimJXmriA9k?rel=0" width="480"></iframe><br /></div>
А значит пришлось переписать подпрограмму поворота, теперь во время поворота постоянно опрашивается датчик:<br />
<blockquote class="tr_bq">
<pre><span style="color: #cc6600;">void</span> Rotation(<span style="color: #cc6600;">int</span> t){ <span style="color: #7e7e7e;">// подпрограмма Поворот</span>
<span style="color: #cc6600;">unsigned</span> <span style="color: #cc6600;">long</span> prevMillis = <span style="color: #cc6600;">millis</span>();
<span style="color: #cc6600;">unsigned</span> <span style="color: #cc6600;">long</span> currentMillis;
<span style="color: #cc6600;">if</span> (isCW) TurnRight(); <span style="color: #7e7e7e;">// если переменная isCW правда (true) то поворачиваем направо, </span>
<span style="color: #cc6600;">else</span> TurnLeft(); <span style="color: #7e7e7e;">// иначе налево</span>
<span style="color: #cc6600;">do</span> <span style="color: #7e7e7e;">// ждем нужное время, но постоянно смотрим в пол</span>
{
<span style="color: #cc6600;">if</span>(isLine()) <span style="color: #cc6600;">return</span>;
currentMillis = <span style="color: #cc6600;">millis</span>();
} <span style="color: #cc6600;">while</span> (prevMillis + t >= currentMillis);
}
</pre>
</blockquote>
Во тут то я и задумавшись о большой трассе придумал интересную штуку: ведь робот потеряв специально утонченную линию найдет другую, рядом стоящую, а это значит что для робота можно рисовать 'стрелки', т.е. развилки по которым он будет ездить в определенном направлении.<br />
Вот четыре штуки для примера:<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgN7q136Dgpniq_c7_gZ1XG2TjsZY6Jh6lFSFvlbtsDPhGR4Yu55PUTbrPzZOzgtYKE-hBc9gyCSKdF28b0pdlHhP1pA4rNUB_FoMOiEMiFs0Qa0fM5idoFoqQxG92sJRQuSI1B45pCxfiK/s1600/NewFieldSample.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="Пример блоков-развилок трассы для робота ездящего по линии" border="0" height="158" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgN7q136Dgpniq_c7_gZ1XG2TjsZY6Jh6lFSFvlbtsDPhGR4Yu55PUTbrPzZOzgtYKE-hBc9gyCSKdF28b0pdlHhP1pA4rNUB_FoMOiEMiFs0Qa0fM5idoFoqQxG92sJRQuSI1B45pCxfiK/s640/NewFieldSample.png" title="Пример блоков-развилок трассы для робота ездящего по линии" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-size: x-small; text-align: left;">стрелками показаны гарантированное направление движения робота</span></td></tr>
</tbody></table>
Очередная идея требует очередной трассы для теста. На этот раз трассу сделал чуток побольше, к тому же добавил пару усложненных элементов для проверки 'проходимости' датчика линии.<br />
<div style="text-align: center;">
<iframe allowfullscreen="" frameborder="0" height="360" src="//www.youtube.com/embed/PNatxThOQkU?rel=0" width="480"></iframe><br /></div>
Снова тест вскрыл некоторые недостатки, на видео не видно (так как я вырезал), но робот зашел в первый поворот наверное только с пятого раза, а то все время ломился прямо :(<br />
А все потому, что светодиод и фотодиод расположены поперек движения робота и соответственно поле сканирования получилось излишне широким. Сделал новый датчик со светодиодами расположенными в линию:<br />
<table align="center" border="0" style="width: 100%px;"><tbody>
<tr> <td><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJiZSQ3pBLe9zyodm2eOK0oxmT2LyKyEsvuvHccVIDCEk-iJuciBTD9G73YSQUZu7QwbqrtnfMzSAWB7Ak92LfjArm56xOq6OgJwo4ZPRjFAqVpstpwcjl4cSp0q8ZC1WXu0J8ocSIZpnp/s1600/2013-09-07+21.55.39+(2).jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="214" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJiZSQ3pBLe9zyodm2eOK0oxmT2LyKyEsvuvHccVIDCEk-iJuciBTD9G73YSQUZu7QwbqrtnfMzSAWB7Ak92LfjArm56xOq6OgJwo4ZPRjFAqVpstpwcjl4cSp0q8ZC1WXu0J8ocSIZpnp/s320/2013-09-07+21.55.39+(2).jpg" width="320" /></a></td> <td><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhs70F2qDMvaJje4tXqQs_RyszQN3beLXi20T7nX3NoF6Qx3jYNqN_xU0iqQJ1OROSX5YudtZJvmQf8hPrE8CzS3_EODIyEEJ7i2z1C7uoXBemvIer0enaaZ482yCSv8hp0IhFxo2xUr20A/s1600/2013-09-07+21.56.03+(2).jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="213" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhs70F2qDMvaJje4tXqQs_RyszQN3beLXi20T7nX3NoF6Qx3jYNqN_xU0iqQJ1OROSX5YudtZJvmQf8hPrE8CzS3_EODIyEEJ7i2z1C7uoXBemvIer0enaaZ482yCSv8hp0IhFxo2xUr20A/s320/2013-09-07+21.56.03+(2).jpg" width="320" /></a></td> </tr>
</tbody></table>
<div style="text-align: center;">
<span style="font-size: x-small;">Более подробно в заметке <a href="http://blockduino.blogspot.com/2013/09/clecloproto.html" target="_blank">Паяем датчик линии на CleClo:Proto</a></span></div>
С таким датчиком он стал более уверенно входить в повороты, поэтому немного подумав склепал трассу побольше, которую уже можно назвать "железной дорогой" из бумаги.<br />
Размер ее 6 на 4 блока. Как и предыдущие, блоки распечатаны на бумаге А4, вырезаны в квадраты и склеены в кучу скотчем. На видео первая проба, поэтому не догадался заранее приклеить трассу скотчем к палубе и когда робот заезжает на крайних блоках гусеницей на палубу, то трасса сползает. Пришлось придерживать рукой.<br />
Видео отчет (чтобы не томить длительной ездой, часть видео воспроизводится в ускоренном виде):<br />
<div style="text-align: center;">
<iframe allowfullscreen="" frameborder="0" height="360" src="//www.youtube.com/embed/KO22jJQ9n2I?rel=0" width="480"></iframe><br />
<div style="text-align: left;">
Получил массу удовольствия - вспомнил детство. </div>
<div style="text-align: left;">
Если наштамповать таких блоков побольше на картонках или на пластике, то можно с легкостью конструировать разные поля. Наверняка это будет увлекательным развлечением ребятне на разных робо-кружках.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Для интересующихся:</div>
<div style="text-align: left;">
</div>
<ul style="text-align: left;">
<li>архив с файлами блоков <a href="http://blockduino.org/Codes/Line_Rider_Fields.zip" target="_blank">Line_Rider_Fields.zip</a></li>
<li>скетч для робота <a href="http://blockduino.org/Codes/Line_Rider_OneSensor-130928a.zip" target="_blank">Line_Rider_OneSensor-130928a.zip</a></li>
</ul>
</div>
</div>
Vasyl Yudinhttp://www.blogger.com/profile/05599352575777495536noreply@blogger.com0Тринидад и Тобаго10.691803 -61.2225030000000178.69508 -63.804290000000016 12.688526 -58.640716000000019tag:blogger.com,1999:blog-703725759950508617.post-89978328382823485362013-10-22T07:06:00.001-07:002013-11-11T07:16:34.054-08:00Inclination Rider - Едем по наклонной<div dir="ltr" style="text-align: left;" trbidi="on">
Как и обещал, подключил акселерометр к управлению роботом.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTyL48SZsXLsqcXuGuPKrOs2QljTcAIMyLgAuiuUpvzmWduuklhdIQ-NjIuLEc1ZIiegNHtA1ROO4-qRI5PvbrCUwRaj-YWk_sxJpJCZHG4D7WpPKipUvj-xRcp9xk3x31x_sQH4kiTGaT/s1600/Compass_Rider_15.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="213" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTyL48SZsXLsqcXuGuPKrOs2QljTcAIMyLgAuiuUpvzmWduuklhdIQ-NjIuLEc1ZIiegNHtA1ROO4-qRI5PvbrCUwRaj-YWk_sxJpJCZHG4D7WpPKipUvj-xRcp9xk3x31x_sQH4kiTGaT/s320/Compass_Rider_15.jpg" width="320" /></a></div>
Inclination Rider - Робот поворачивается в сторону небольшого наклона и едет вперед при бо'льшем наклоне.<br />
<br />
Алгоритм прост:<br />
<ul style="text-align: left;">
<li>если наклон по Х(право-лево) и Y(нос-корма) меньше допустимого, то стоим;</li>
<li>если нос вниз и левый борт чуток внизу, то направо;</li>
<li>если нос вниз и правый борт чуток внизу, то налево;</li>
<li>если левый борт внизу, то направо;</li>
<li>если правый борт внизу, то налево;</li>
<li>а если нос вверх в два раза больше допустимого, то едем вперед;</li>
</ul>
<div>
<a name='more'></a><br /></div>
<div style="margin: 5px 20px 20px;">
<div class="smallfont" style="margin-bottom: 2px;">
Код под спойлером: <input onclick="if (this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display != '') { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = ''; this.innerText = ''; this.value = 'Скрыть'; } else { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = 'none'; this.innerText = ''; this.value = 'Показать'; }" style="font-size: 10px; margin: 0px; padding: 0px; width: 60px;" type="button" value="Показать" /> </div>
<br />
<div class="alt2" style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-size: auto auto; background-attachment: scroll; background-color: whitesmoke; background-image: none; background-position: 0% 50%; background-repeat: repeat; border: 1px inset; line-height: 1.5em; margin: 0px; padding: 6px;">
<div style="display: none;">
<!-- Начало вставки --><br />
<pre><span style="color: #7e7e7e;">// Inclination Rider - Робот поворачивается в сторону небольшого наклона</span>
<span style="color: #7e7e7e;">// и едет вперед при бóльшем наклоне</span>
<span style="color: #7e7e7e;">// http://blockduino.org</span>
<span style="color: #7e7e7e;">// http://blockduino.blogger.com/2013/10/nclination-rider.html</span>
<span style="color: #7e7e7e;">// Oct 2013</span>
#include <<span style="color: #cc6600;">Wire</span>.h> <span style="color: #7e7e7e;">// библиотека для подключения по протоколу I2C</span>
#include <<span style="color: #cc6600;">LSM303</span>.h> <span style="color: #7e7e7e;">// библиотека для работы с микросхемой LSM303</span>
#include <BDMotor.h> <span style="color: #7e7e7e;">// для BlockDuino и BlockMotor</span>
<span style="color: #7e7e7e;">//#include <AFMotor.h> // для Arduino и MotorShield</span>
#define SPEED 255 <span style="color: #7e7e7e;">// скорость вращения моторчиков, 255 - максимум</span>
#define LED_PIN 13 <span style="color: #7e7e7e;">// номер порта для ножки индикаторного светодиода</span>
<span style="color: #cc6600;">int</span> x, y; <span style="color: #7e7e7e;">// переменные для хранения показания сенсора</span>
<span style="color: #cc6600;">int</span> tol = 100; <span style="color: #7e7e7e;">// величина предельного наклона </span>
<span style="color: #cc6600;">AF_DCMotor</span> mL(1); <span style="color: #7e7e7e;">// #1 моторчик левой гусеницы</span>
<span style="color: #cc6600;">AF_DCMotor</span> mR(4); <span style="color: #7e7e7e;">// #2 моторчик правой гусеницы</span>
<span style="color: #cc6600;">LSM303</span> compass;
<span style="color: #cc6600;">void</span> <span style="color: #cc6600;"><b>setup</b></span>() {
<span style="color: #cc6600;"><b>Serial</b></span>.<span style="color: #cc6600;">begin</span>(9600); <span style="color: #7e7e7e;">// Создаем подключение серийного порта</span>
<span style="color: #cc6600;">Wire</span>.<span style="color: #cc6600;">begin</span>(); <span style="color: #7e7e7e;">// запускаем протокол I2C</span>
compass.<span style="color: #cc6600;">init</span>(); <span style="color: #7e7e7e;">// подключаем и </span>
compass.<span style="color: #cc6600;">enableDefault</span>(); <span style="color: #7e7e7e;">// запускаем компас</span>
compass.<span style="color: #cc6600;">read</span>(); <span style="color: #7e7e7e;">// считываем первое значение</span>
x = (<span style="color: #cc6600;">int</span>)compass.a.x; <span style="color: #7e7e7e;">// по х и y</span>
y = (<span style="color: #cc6600;">int</span>)compass.a.y; <span style="color: #7e7e7e;">// </span>
<span style="color: #cc6600;">pinMode</span>(LED_PIN, <span style="color: #006699;">OUTPUT</span>); <span style="color: #7e7e7e;">// Объявляем порт индикаторного светодиода</span>
mL.<span style="color: #cc6600;">setSpeed</span>(SPEED); <span style="color: #7e7e7e;">// устанавливаем скорость вращения левого моторчика</span>
mR.<span style="color: #cc6600;">setSpeed</span>(SPEED); <span style="color: #7e7e7e;">// устанавливаем скорость вращения правого моторчика</span>
}
<span style="color: #cc6600;">void</span> <span style="color: #cc6600;"><b>loop</b></span>() { <span style="color: #7e7e7e;">// Основное тело программы</span>
compass.<span style="color: #cc6600;">read</span>(); <span style="color: #7e7e7e;">// считываем и сразу же сглаживаем показания акселерометра</span>
x = digitalLowPass(x, (<span style="color: #cc6600;">int</span>)compass.a.x, 0.75);
y = digitalLowPass(y, (<span style="color: #cc6600;">int</span>)compass.a.y, 0.75);
<span style="color: #cc6600;">if</span> (<span style="color: #cc6600;">abs</span>(y)<tol && <span style="color: #cc6600;">abs</span>(x)<tol) Stop(); <span style="color: #7e7e7e;">// если наклон в пределах, то стоим</span>
<span style="color: #cc6600;">else</span> <span style="color: #cc6600;">if</span> (y<-tol && x<-tol/2) TurnLeft(); <span style="color: #7e7e7e;">// если нос внизу и правый бок внизу, то крутимся влево</span>
<span style="color: #cc6600;">else</span> <span style="color: #cc6600;">if</span> (y<-tol && x>tol/2) TurnRight(); <span style="color: #7e7e7e;">// если нос внизу и левый бок внизу, то крутимся вправо</span>
<span style="color: #cc6600;">else</span> <span style="color: #cc6600;">if</span> (x<-tol) TurnLeft(); <span style="color: #7e7e7e;">// если завалились на правый бок, то крутимся влево</span>
<span style="color: #cc6600;">else</span> <span style="color: #cc6600;">if</span> (x>tol) TurnRight(); <span style="color: #7e7e7e;">// если завалились на левый бок, то крутимся вправо</span>
<span style="color: #cc6600;">else</span> <span style="color: #cc6600;">if</span> (y>2*tol) Run(); <span style="color: #7e7e7e;">// если нос поднят в два допуска, то едем вперед</span>
<span style="color: #cc6600;">delay</span>(100);
} <span style="color: #7e7e7e;">// конец основной программы, начинаем все сначала</span>
<span style="color: #7e7e7e;">//</span>
<span style="color: #7e7e7e;">// Подпрограммы</span>
<span style="color: #7e7e7e;">//</span>
<span style="color: #7e7e7e;">//Digital low pass filter</span>
<span style="color: #cc6600;">double</span> digitalLowPass(<span style="color: #cc6600;">double</span> last_smoothed, <span style="color: #cc6600;">double</span> new_value, <span style="color: #cc6600;">double</span> filterVal)
{
<span style="color: #cc6600;">return</span> (new_value * (1 - filterVal)) + (last_smoothed * filterVal);
}
<span style="color: #cc6600;">void</span> Stop(){ <span style="color: #7e7e7e;">// подпрограмма Остановка</span>
mL.<span style="color: #cc6600;">run</span>(<span style="color: #006699;">RELEASE</span>);
mR.<span style="color: #cc6600;">run</span>(<span style="color: #006699;">RELEASE</span>);
<span style="color: #cc6600;">digitalWrite</span>(LED_PIN, <span style="color: #006699;">HIGH</span>);
<span style="color: #cc6600;"><b>Serial</b></span>.<span style="color: #cc6600;">println</span>(<span style="color: #006699;">"Stop"</span>);
}
<span style="color: #cc6600;">void</span> Run(){ <span style="color: #7e7e7e;">// подпрограмма Ход вперед</span>
mL.<span style="color: #cc6600;">run</span>(<span style="color: #006699;">FORWARD</span>);
mR.<span style="color: #cc6600;">run</span>(<span style="color: #006699;">FORWARD</span>);
<span style="color: #cc6600;">digitalWrite</span>(LED_PIN, <span style="color: #006699;">LOW</span>);
<span style="color: #cc6600;"><b>Serial</b></span>.<span style="color: #cc6600;">println</span>(<span style="color: #006699;">"Run"</span>);
}
<span style="color: #cc6600;">void</span> TurnRight(){ <span style="color: #7e7e7e;">// подпрограмма Поворот направо</span>
mL.<span style="color: #cc6600;">run</span>(<span style="color: #006699;">FORWARD</span>);
mR.<span style="color: #cc6600;">run</span>(<span style="color: #006699;">BACKWARD</span>);
<span style="color: #cc6600;">digitalWrite</span>(LED_PIN, <span style="color: #006699;">LOW</span>);
<span style="color: #cc6600;"><b>Serial</b></span>.<span style="color: #cc6600;">println</span>(<span style="color: #006699;">"TurnRight"</span>);
}
<span style="color: #cc6600;">void</span> TurnLeft(){ <span style="color: #7e7e7e;">// подпрограмма Поворот налево</span>
mR.<span style="color: #cc6600;">run</span>(<span style="color: #006699;">FORWARD</span>);
mL.<span style="color: #cc6600;">run</span>(<span style="color: #006699;">BACKWARD</span>);
<span style="color: #cc6600;">digitalWrite</span>(LED_PIN, <span style="color: #006699;">LOW</span>);
<span style="color: #cc6600;"><b>Serial</b></span>.<span style="color: #cc6600;">println</span>(<span style="color: #006699;">"TurnLeft"</span>);
}
</pre>
<!-- Конец вставки --><br />
<br />
<br /></div>
</div>
</div>
<!-- Конец спойлера-->Видео отчет:<br />
<div style="text-align: center;">
<iframe allowfullscreen="" frameborder="0" height="360" src="//www.youtube.com/embed/QEee9J52MSM?rel=0" width="480"></iframe><br /></div>
</div>
Vasyl Yudinhttp://www.blogger.com/profile/05599352575777495536noreply@blogger.com0Девон, Великобритания50.303375753563131 -4.18579101562550.141393753563129 -4.508514515625 50.465357753563133 -3.863067515625tag:blogger.com,1999:blog-703725759950508617.post-30087789392048156142013-10-21T15:08:00.000-07:002013-11-11T05:12:42.696-08:00Compass Rider - Робот знающий свое направление<div dir="ltr" style="text-align: left;" trbidi="on">
Продолжаем играться в роботов.<br />
<br />
На этот раз прикурочил я к моему роботу компас на микросхеме LSM303, от Sparkfun.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ0WIjIJ7scxehPDeS2hDoB8-lOM-6vE-rlvidlhfMdlgBh4rbwcmsh74iHN8NgbccqK87nhBxoBgsGN1CWp-PdsWXDNPFVICJLI3EF6Qx10XDebEmmSVZVkiyT_N7NzllzjuN-VxDvYis/s1600/Compass_Rider_3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Робот с компасом на основе LSM303" border="0" height="266" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ0WIjIJ7scxehPDeS2hDoB8-lOM-6vE-rlvidlhfMdlgBh4rbwcmsh74iHN8NgbccqK87nhBxoBgsGN1CWp-PdsWXDNPFVICJLI3EF6Qx10XDebEmmSVZVkiyT_N7NzllzjuN-VxDvYis/s400/Compass_Rider_3.jpg" title="Робот с компасом на основе LSM303" width="400" /></a></div>
<br />
<br />
Замечательная штучка - работает по протоколу I2C, а у меня как раз под нее разъемчик появился.<br />
<a name='more'></a><br />
Долго расписываться не буду - робот тупо стоит на месте, но старается из всех сил держать направление. Т.е. возражает от попыток его крутить и поворачивается в нужную сторону. Притом не крутится тупо в одну сторону, а интеллектуально вычисляет кратчайшее расстояние.<br />
<br />
Кстати этот компас нужно сначала откалибровать. А то я по первой проигнорировал калибровку, а потом не смог сразу догнать, чего мой робот считает кратчайшим направление в одну сторону 90 градусов, а в другую все 270. А оказалось что на 90 градусов компас показывал все 180!<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJhrV6wusZ5ZEMpuBA_VKgoODcAsWnHRaSasm30Bg41brTpIsaVINt4gIEqCCCPsOZTTA_QtvYEcwjsFtqHm7R4apYP5cdrqA1NEUZhD-Xm3OxCFitW1_fWIDTD1bch7NjavMpsEgrgt08/s1600/Compass_Rider_2.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img alt="Показания компаса без (вверху) и с калибровкой (внизу)" border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJhrV6wusZ5ZEMpuBA_VKgoODcAsWnHRaSasm30Bg41brTpIsaVINt4gIEqCCCPsOZTTA_QtvYEcwjsFtqHm7R4apYP5cdrqA1NEUZhD-Xm3OxCFitW1_fWIDTD1bch7NjavMpsEgrgt08/s400/Compass_Rider_2.jpg" title="Compass Rider - робот с компасом" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Показания компаса без (вверху) и с калибровкой (внизу)</td></tr>
</tbody></table>
Ну, вроде бы все.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhN8cgeDV60uaGDB53vV4icpD7UgJX3ZsJarByLfl3Dz4swKRj4vC-BG58Azv_P7QO0yLsDGvlmftwiqrY9nmjrm3MUICLo9p_NAPyyF23AYGtrLEk959H3XfU1hvOU7aDPBHiAPCZvK0wz/s1600/Compass_Rider_1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="266" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhN8cgeDV60uaGDB53vV4icpD7UgJX3ZsJarByLfl3Dz4swKRj4vC-BG58Azv_P7QO0yLsDGvlmftwiqrY9nmjrm3MUICLo9p_NAPyyF23AYGtrLEk959H3XfU1hvOU7aDPBHiAPCZvK0wz/s400/Compass_Rider_1.jpg" width="400" /></a></div>
<br />
Тут код, а там видео-отчет.<br />
<!-- Начало спойлера--><br />
<div style="margin: 5px 20px 20px;">
<div class="smallfont" style="margin-bottom: 2px;">
Код под спойлером: <input onclick="if (this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display != '') { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = ''; this.innerText = ''; this.value = 'Скрыть'; } else { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = 'none'; this.innerText = ''; this.value = 'Показать'; }" style="font-size: 10px; margin: 0px; padding: 0px; width: 60px;" type="button" value="Показать" /> </div>
<br />
<div class="alt2" style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-size: auto auto; background-attachment: scroll; background-color: whitesmoke; background-image: none; background-position: 0% 50%; background-repeat: repeat; border: 1px inset; line-height: 1.5em; margin: 0px; padding: 6px;">
<div style="display: none;">
<!-- Начало вставки --><br />
<pre><span style="color: #7e7e7e;">// Compass Rider - Робот удерживающий направление </span>
<span style="color: #7e7e7e;">// Note: робот поворачивается по кратчайшему пути!</span>
<span style="color: #7e7e7e;">// http://blockduino.org/</span>
<span style="color: #7e7e7e;">// http://blockduino.blogger.com/2013/10/compass-rider.html</span>
<span style="color: #7e7e7e;">// Vasyl Yudin</span>
<span style="color: #7e7e7e;">// Oct 2013</span>
#include <<span style="color: #cc6600;">Wire</span>.h> <span style="color: #7e7e7e;">// библиотека для подключения по протоколу I2C</span>
#include <<span style="color: #cc6600;">LSM303</span>.h> <span style="color: #7e7e7e;">// библиотека для работы с микросхемой LSM303</span>
#include <BDMotor.h> <span style="color: #7e7e7e;">// для BlockDuino и BlockMotor</span>
<span style="color: #7e7e7e;">//#include <AFMotor.h> // для Arduino и MotorShield</span>
#define SPEED 255 <span style="color: #7e7e7e;">// скорость вращения моторчиков, 255 - максимум</span>
#define LED_PIN 13 <span style="color: #7e7e7e;">// номер порта для ножки индикаторного светодиода</span>
<span style="color: #cc6600;">int</span> sensor; <span style="color: #7e7e7e;">// переменная для хранения показания сенсора</span>
<span style="color: #cc6600;">int</span> dir = 180; <span style="color: #7e7e7e;">// заданное направление</span>
<span style="color: #cc6600;">int</span> tol = 20; <span style="color: #7e7e7e;">// допустимая точность удерживания направления</span>
<span style="color: #cc6600;">AF_DCMotor</span> mL(1); <span style="color: #7e7e7e;">// #1 моторчик левой гусеницы</span>
<span style="color: #cc6600;">AF_DCMotor</span> mR(4); <span style="color: #7e7e7e;">// #2 моторчик правой гусеницы</span>
<span style="color: #cc6600;">LSM303</span> compass;
<span style="color: #cc6600;">void</span> <span style="color: #cc6600;"><b>setup</b></span>() {
<span style="color: #cc6600;"><b>Serial</b></span>.<span style="color: #cc6600;">begin</span>(9600); <span style="color: #7e7e7e;">// Создаем подключение серийного порта</span>
<span style="color: #cc6600;">Wire</span>.<span style="color: #cc6600;">begin</span>(); <span style="color: #7e7e7e;">// Подключаем протокол I2C</span>
compass.<span style="color: #cc6600;">init</span>(); <span style="color: #7e7e7e;">// подключаем и </span>
compass.<span style="color: #cc6600;">enableDefault</span>(); <span style="color: #7e7e7e;">// запускаем компас</span>
<span style="color: #7e7e7e;">// Значение калибровки. Используйте пример Calibrate для вашего компаса</span>
compass.m_min.x = -543; compass.m_min.y = -303; compass.m_min.z = -300;
compass.m_max.x = +195; compass.m_max.y = +408; compass.m_max.z = 312;
<span style="color: #cc6600;">pinMode</span>(LED_PIN, <span style="color: #006699;">OUTPUT</span>); <span style="color: #7e7e7e;">// Объявляем порт индикаторного светодиода</span>
mL.<span style="color: #cc6600;">setSpeed</span>(SPEED); <span style="color: #7e7e7e;">// устанавливаем скорость вращения левого моторчика</span>
mR.<span style="color: #cc6600;">setSpeed</span>(SPEED); <span style="color: #7e7e7e;">// устанавливаем скорость вращения правого моторчика</span>
}
<span style="color: #cc6600;">void</span> <span style="color: #cc6600;"><b>loop</b></span>() { <span style="color: #7e7e7e;">// ------- Основное тело программы</span>
compass.<span style="color: #cc6600;">read</span>(); <span style="color: #7e7e7e;">// считываем показания компаса</span>
<span style="color: #cc6600;">int</span> <span style="color: #cc6600;">heading</span> = compass.<span style="color: #cc6600;">heading</span>(); <span style="color: #7e7e7e;">// вынимаем из показаний величину направление компаса</span>
<span style="color: #cc6600;">if</span> (<span style="color: #cc6600;">abs</span>(<span style="color: #cc6600;">heading</span> - sensor)>320) sensor = <span style="color: #cc6600;">heading</span>; <span style="color: #7e7e7e;">// отсекаем проблемный переход из 359° в 1°</span>
sensor = (<span style="color: #cc6600;">int</span>)digitalLowPass(sensor, <span style="color: #cc6600;">heading</span>, 0.7); <span style="color: #7e7e7e;">// отфильтровываем показания компаса (сглаживаем)</span>
<span style="color: #cc6600;">int</span> dif = sensor - dir; <span style="color: #7e7e7e;">// вычисляем разницу между реальным направлением и заданным</span>
<span style="color: #cc6600;">int</span> absdif = <span style="color: #cc6600;">abs</span>(dif);
<span style="color: #cc6600;">if</span> (absdif <= tol) Stop(); <span style="color: #7e7e7e;">// если разница меньше допустимой погрешности, то останавливаемся</span>
<span style="color: #cc6600;">else</span> <span style="color: #cc6600;">if</span> (((absdif > 180) && (dif != absdif)) || ((absdif < 180) && (dif == absdif))) TurnLeft(); <span style="color: #7e7e7e;">// иначе определяем кратчайшее направление поворота</span>
<span style="color: #cc6600;">else</span> TurnRight();
<span style="color: #7e7e7e;">// delay(25);</span>
} <span style="color: #7e7e7e;">// конец основной программы, начинаем все сначала</span>
<span style="color: #7e7e7e;">//</span>
<span style="color: #7e7e7e;">// Подпрограммы</span>
<span style="color: #7e7e7e;">//</span>
<span style="color: #7e7e7e;">// Цифровой низкочастотный фильт</span>
<span style="color: #cc6600;">double</span> digitalLowPass(<span style="color: #cc6600;">double</span> last_smoothed, <span style="color: #cc6600;">double</span> new_value, <span style="color: #cc6600;">double</span> filterVal)
{
<span style="color: #cc6600;">return</span> (new_value * (1 - filterVal)) + (last_smoothed * filterVal);
}
<span style="color: #cc6600;">void</span> Stop(){ <span style="color: #7e7e7e;">// подпрограмма Остановка</span>
mL.<span style="color: #cc6600;">run</span>(<span style="color: #006699;">RELEASE</span>);
mR.<span style="color: #cc6600;">run</span>(<span style="color: #006699;">RELEASE</span>);
<span style="color: #cc6600;">digitalWrite</span>(LED_PIN, <span style="color: #006699;">HIGH</span>);
}
<span style="color: #cc6600;">void</span> TurnRight(){ <span style="color: #7e7e7e;">// подпрограмма Поворот направо</span>
mL.<span style="color: #cc6600;">run</span>(<span style="color: #006699;">FORWARD</span>);
mR.<span style="color: #cc6600;">run</span>(<span style="color: #006699;">BACKWARD</span>);
<span style="color: #cc6600;">digitalWrite</span>(LED_PIN, <span style="color: #006699;">LOW</span>);
}
<span style="color: #cc6600;">void</span> TurnLeft(){ <span style="color: #7e7e7e;">// подпрограмма Поворот налево</span>
mR.<span style="color: #cc6600;">run</span>(<span style="color: #006699;">FORWARD</span>);
mL.<span style="color: #cc6600;">run</span>(<span style="color: #006699;">BACKWARD</span>);
<span style="color: #cc6600;">digitalWrite</span>(LED_PIN, <span style="color: #006699;">LOW</span>);
}
</pre>
<!-- Конец вставки --><br />
<br />
<br /></div>
</div>
</div>
Видео-отчет:<br />
<div style="text-align: center;">
<object height="360" width="480"><param name="movie" value="//www.youtube.com/v/OjkxmfS-VG4?hl=ru_RU&version=3"></param>
<param name="allowFullScreen" value="true"></param>
<param name="allowscriptaccess" value="always"></param>
<embed src="//www.youtube.com/v/OjkxmfS-VG4?hl=ru_RU&version=3" type="application/x-shockwave-flash" width="480" height="360" allowscriptaccess="always" allowfullscreen="true"></embed></object></div>
<br />
зы Кстати в этой микросхеме оказывается есть и акселерометр. Так что в следующий раз с ним что-то подмучу.</div>
Vasyl Yudinhttp://www.blogger.com/profile/05599352575777495536noreply@blogger.com0tag:blogger.com,1999:blog-703725759950508617.post-27195316681937561242013-09-25T17:05:00.001-07:002013-10-24T15:26:24.155-07:00Робот бегущий по линии, с одним датчиком - Line Rider 1<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhr7P1TcocmvI6C1ffAfQWq329NjtXUXRKtYKSinGrTsKz_-jfeaRbJ4pqmlmdR7KYXh_jOQmHVWLRxfwvvJvRs9atSCQHyOJ33afYrwga6LU9JDtFDVD5kKV8MB8FcO4U-cQikgvn6Vp6T/s1600/Boundary-Rider-2.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="213" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhr7P1TcocmvI6C1ffAfQWq329NjtXUXRKtYKSinGrTsKz_-jfeaRbJ4pqmlmdR7KYXh_jOQmHVWLRxfwvvJvRs9atSCQHyOJ33afYrwga6LU9JDtFDVD5kKV8MB8FcO4U-cQikgvn6Vp6T/s320/Boundary-Rider-2.jpg" width="320" /></a></div>
Отчитавшись о Boundary Rider, в тот же вечер сел думать о следующих шагах на пути к роботу ездящему по линии, а так как паять еще один датчик было лень, да и не из чего (нужно распаивать другой датчик), то решил поизгаляться и заделать такого робота с одним датчиком.<br />
Дело за малым - за алгоритмом и его реализацией. С алгоритмом решил не усложнять и пошел по простому пути:<br />
<blockquote class="tr_bq">
<span class="Apple-tab-span" style="white-space: pre;"> </span> смотрим в пол<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> если линия есть, то едем дальше<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> иначе (линии нет):<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>поворачиваем чуток в заданную сторону<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>если снова линии нет:<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>то меняем направление поворота<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>поворачиваем в два раза больше чем чуток в другую сторону<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>начинаем все сначала<br />
<a name='more'></a></blockquote>
Программу написал на основе кода для <a href="http://blockduino.blogspot.com/2013/09/boundary-rider.html" target="_blank">Boundary Rider</a>, только добавил подпрограмму оценки цвета пола [isLine()], и еще выбросил ненужную подпрограмму хода назад.<br />
В принципе программа заработала сразу, только есть небольшой недостаток, если робот шибко далеко вылетает за пределы линии, например когда линия заворачивает слишком уж резко, то робот начинает пританцовывать на одном месте. Т.е. просто подвисает. Решить эту проблему можно несколькими способами, например увеличить минимальный угол поворота, т.е. увеличить сектор обзора робота. Или можно увеличить угол поворота назад на линию не в два, а в три, а то и в четыре раза (строка 40).<br />
Или еще можно поставить счетчик количества съездов с линии и обнулять его при движении прямо. А когда счетчик достигнет какой-то критической величины, то давать команду на поиск линии.<br />
<div>
<br />
Код: <a href="http://blockduino.org/Codes/Line_Rider_OneSensor-130920a.zip" target="_blank">Line_Rider_OneSensor-130920a.zip</a><br />
Улучшенный вариант с поиском потерянной линии: <a href="http://blockduino.org/Codes/Line_Rider_OneSensor-130925a.zip" target="_blank">Line_Rider_OneSensor-130925a.zip</a><br />
<br />
Видео отчет:<br />
<div style="text-align: center;">
<object height="360" width="480"><param name="movie" value="//www.youtube.com/v/q3xEL62Rzqc?version=3&hl=ru_RU"></param>
<param name="allowFullScreen" value="true"></param>
<param name="allowscriptaccess" value="always"></param>
<embed src="//www.youtube.com/v/q3xEL62Rzqc?version=3&hl=ru_RU" type="application/x-shockwave-flash" width="480" height="360" allowscriptaccess="always" allowfullscreen="true"></embed></object></div>
</div>
</div>
Vasyl Yudinhttp://www.blogger.com/profile/05599352575777495536noreply@blogger.com0tag:blogger.com,1999:blog-703725759950508617.post-12822375521437263592013-09-19T18:09:00.001-07:002013-10-24T15:27:17.086-07:00Робот не выезжающий за черную линию - Boundary Rider<div dir="ltr" style="text-align: left;" trbidi="on">
Продолжаем экспериментировать с гусеничной платформой от Pololu.<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihOftQqGzEnxZfHWT9eZt1NXvV8Rge1_W0RhgCeRr4fALsMfSz56AMt5T7agt2nca1CTCd3RtfOPss5POfhrIt4w7vwHT_ZeaOcpooJpJEEwQ-tgL8tVCAbVtQ_ULSzSM6mUJlJLiIyr3s/s1600/Boundary-Rider-2.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img alt="Вид робота Boundary Rider" border="0" height="213" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihOftQqGzEnxZfHWT9eZt1NXvV8Rge1_W0RhgCeRr4fALsMfSz56AMt5T7agt2nca1CTCd3RtfOPss5POfhrIt4w7vwHT_ZeaOcpooJpJEEwQ-tgL8tVCAbVtQ_ULSzSM6mUJlJLiIyr3s/s320/Boundary-Rider-2.jpg" title="Вид робота Boundary Rider" width="320" /></a><br />
Захотелось на этот раз сделать робота ездящего по линии, для этого я запаял датчик линии, вернее датчик яркости: <a href="http://blockduino.blogspot.com/2013/09/clecloproto.html" target="_blank">Паяем датчик линии на CleClo:Proto</a><br />
Но так как датчик пока один, то решил пока сделать робота не выезжающий за границу.<br />
Робот состоит из:<br />
<ul>
<li><a href="http://blockduino.org/mediawiki/index.php?title=BlockDuino">Blockduino</a></li>
<li><a href="http://blockduino.org/mediawiki/index.php?title=BlockMotor">BlockMotor</a></li>
<li><a href="http://blockduino.blogspot.com/2013/09/clecloproto.html" target="_blank">Датчик яркости</a></li>
</ul>
<div>
Датчик подключил сразу напрямую в <a href="http://blockduino.org/mediawiki/index.php?title=%D0%A8%D0%B8%D0%BD%D0%B0_BlockDuino" target="_blank">шину BlockDuino</a>, благо этому ничего не мешает, шина у нас пустая. Подключил в порт A0.<br />
<a name='more'></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzkGd99CSlpy3iHixFym_GbF5YvAXxoO0-6zuuXbdVUwQ5EpvU1YcaXZxNEZRnxBhWQmtF7rE6kBwobjIsrU7Ny8QgUxHn8fkEuKU0BSsbqwp3lmL11XZ9x4rGvNxuESYshJ26Y8mEdvfR/s1600/Boundary-Rider-1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img alt="Подключение датчика линии к роботу" border="0" height="213" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzkGd99CSlpy3iHixFym_GbF5YvAXxoO0-6zuuXbdVUwQ5EpvU1YcaXZxNEZRnxBhWQmtF7rE6kBwobjIsrU7Ny8QgUxHn8fkEuKU0BSsbqwp3lmL11XZ9x4rGvNxuESYshJ26Y8mEdvfR/s320/Boundary-Rider-1.jpg" title="Подключение датчика линии к роботу" width="320" /></a></div>
<div>
</div>
Доступа в и-нет не было, поэтому алгоритм пришлось выдумывать самому. Хотя долго думать не пришлось, алгоритм простейший:<br />
<ul style="text-align: left;">
<li>если под датчиком темно, то чуток отъезжаем назад и потом поворачиваем в заданную сторону на случайную величину</li>
<li>если под датчиком светло, то едем вперед и меняем направление поворота</li>
</ul>
<!-- Начало спойлера-->
<br />
<div style="margin: 5px 20px 20px;">
<div class="smallfont" style="margin-bottom: 2px;">
Код под спойлером: <input onclick="if (this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display != '') { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = ''; this.innerText = ''; this.value = 'Скрыть'; } else { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = 'none'; this.innerText = ''; this.value = 'Показать'; }" style="font-size: 10px; margin: 0px; padding: 0px; width: 60px;" type="button" value="Показать" /> </div>
<div class="alt2" style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-size: auto auto; background-attachment: scroll; background-color: whitesmoke; background-image: none; background-position: 0% 50%; background-repeat: repeat; border: 1px inset; line-height: 1.5em; margin: 0px; padding: 6px;">
<div style="display: none;">
<!-- Начало вставки -->
<br />
<pre><span style="color: #7e7e7e;">// Boundary Rider - Робот не выезжающий за черную границу</span>
<span style="color: #7e7e7e;">// http://blockduino.org</span>
<span style="color: #7e7e7e;">// http://blockduino.blogger.com/2013/09/boundary-rider.html</span>
<span style="color: #7e7e7e;">// Sept 2013</span>
#include <BDMotor.h> <span style="color: #7e7e7e;">//для BlockDuino и BlockMotor</span>
<span style="color: #7e7e7e;">//#include <AFMotor.h> //для Arduino и MotorShield</span>
#define SPEED 255 <span style="color: #7e7e7e;">// скорость вращения моторчиков, 255 - максимум</span>
#define MIN_ROT 250 <span style="color: #7e7e7e;">// минимальное время поворота, миллисекунд</span>
#define BORDER 850 <span style="color: #7e7e7e;">// показадния сенсора выше которого определяется черный цвет</span>
#define ANALOG_PIN A0 <span style="color: #7e7e7e;">// номер аналогового порта для считывания яркости пола</span>
#define LED_PIN 13 <span style="color: #7e7e7e;">// номер порта для ножки индикаторного светодиода</span>
<span style="color: #cc6600;">boolean</span> isCW = <span style="color: #cc6600;">true</span>; <span style="color: #7e7e7e;">// переменная для хранения направления поворота </span>
<span style="color: #cc6600;">int</span> sensor; <span style="color: #7e7e7e;">// переменная для хранения показания сенсора</span>
<span style="color: #cc6600;">AF_DCMotor</span> mL(1); <span style="color: #7e7e7e;">// #1 моторчик левой гусеницы</span>
<span style="color: #cc6600;">AF_DCMotor</span> mR(2); <span style="color: #7e7e7e;">// #2 моторчик правой гусеницы</span>
<span style="color: #cc6600;">void</span> <span style="color: #cc6600;"><b>setup</b></span>() {
<span style="color: #cc6600;">pinMode</span>(LED_PIN, <span style="color: #006699;">OUTPUT</span>); <span style="color: #7e7e7e;">// Объявляем порт индикаторного светодиода</span>
mL.<span style="color: #cc6600;">setSpeed</span>(SPEED); <span style="color: #7e7e7e;">// устанавливаем скорость вращения левого моторчика</span>
mR.<span style="color: #cc6600;">setSpeed</span>(SPEED); <span style="color: #7e7e7e;">// устанавливаем скорость вращения правого моторчика</span>
}
<span style="color: #cc6600;">void</span> <span style="color: #cc6600;"><b>loop</b></span>() { <span style="color: #7e7e7e;">// Основное тело программы</span>
sensor = <span style="color: #cc6600;">analogRead</span>(ANALOG_PIN); <span style="color: #7e7e7e;">// замеряем яркость пола</span>
<span style="color: #cc6600;">if</span>(sensor > BORDER) { <span style="color: #7e7e7e;">// если больше заданного, то это черный цвет</span>
<span style="color: #cc6600;">digitalWrite</span>(LED_PIN, <span style="color: #006699;">HIGH</span>); <span style="color: #7e7e7e;">// включаем индикаторный светодиод</span>
Back(MIN_ROT * 2); <span style="color: #7e7e7e;">// отъезжаем чуток назад</span>
Rotation(MIN_ROT * <span style="color: #cc6600;">random</span>(1, 10)); <span style="color: #7e7e7e;">// поворачиваем на случайную величину</span>
} <span style="color: #cc6600;">else</span> { <span style="color: #7e7e7e;">// иначе (яркость пола меньше заданного - белый цвет)</span>
Run(); <span style="color: #7e7e7e;">// едем вперед</span>
isCW=!isCW; <span style="color: #7e7e7e;">// меняем направление следующего поворота</span>
<span style="color: #cc6600;">digitalWrite</span>(LED_PIN, <span style="color: #006699;">LOW</span>); <span style="color: #7e7e7e;">// гасим индикаторный светодиод</span>
}
} <span style="color: #7e7e7e;">// конец основной программы, начинаем все сначала</span>
<span style="color: #7e7e7e;">//</span>
<span style="color: #7e7e7e;">// Подпрограммы</span>
<span style="color: #7e7e7e;">//</span>
<span style="color: #cc6600;">void</span> Rotation(<span style="color: #cc6600;">int</span> t){ <span style="color: #7e7e7e;">// подпрограмма Поворот</span>
<span style="color: #cc6600;">if</span> (isCW) TurnRight(); <span style="color: #7e7e7e;">// если переменная isCW правда (true) то поворачиваем направо, </span>
<span style="color: #cc6600;">else</span> TurnLeft(); <span style="color: #7e7e7e;">// иначе налево</span>
<span style="color: #cc6600;">delay</span>(t); <span style="color: #7e7e7e;">// ждем нужное время</span>
Stop(); <span style="color: #7e7e7e;">// останавливаемся</span>
}
<span style="color: #cc6600;">void</span> Stop(){ <span style="color: #7e7e7e;">// подпрограмма Остановка</span>
mL.<span style="color: #cc6600;">run</span>(<span style="color: #006699;">RELEASE</span>);
mR.<span style="color: #cc6600;">run</span>(<span style="color: #006699;">RELEASE</span>);
}
<span style="color: #cc6600;">void</span> Run(){ <span style="color: #7e7e7e;">// подпрограмма Ход вперед</span>
mL.<span style="color: #cc6600;">run</span>(<span style="color: #006699;">FORWARD</span>);
mR.<span style="color: #cc6600;">run</span>(<span style="color: #006699;">FORWARD</span>);
}
<span style="color: #cc6600;">void</span> TurnRight(){ <span style="color: #7e7e7e;">// подпрограмма Поворот направо</span>
mL.<span style="color: #cc6600;">run</span>(<span style="color: #006699;">FORWARD</span>);
mR.<span style="color: #cc6600;">run</span>(<span style="color: #006699;">BACKWARD</span>);
}
<span style="color: #cc6600;">void</span> TurnLeft(){ <span style="color: #7e7e7e;">// подпрограмма Поворот налево</span>
mR.<span style="color: #cc6600;">run</span>(<span style="color: #006699;">FORWARD</span>);
mL.<span style="color: #cc6600;">run</span>(<span style="color: #006699;">BACKWARD</span>);
}
<span style="color: #cc6600;">void</span> Back(<span style="color: #cc6600;">int</span> t){ <span style="color: #7e7e7e;">// подпрограмма Ход назад</span>
mR.<span style="color: #cc6600;">run</span>(<span style="color: #006699;">BACKWARD</span>);
mL.<span style="color: #cc6600;">run</span>(<span style="color: #006699;">BACKWARD</span>);
<span style="color: #cc6600;">delay</span>(t); <span style="color: #7e7e7e;">// ждем нужное время</span>
Stop(); <span style="color: #7e7e7e;">// останавливаемся</span>
}
</pre>
<!-- Конец вставки -->
</div>
</div>
</div>
<!-- Конец спойлера-->
<br />
Алгоритм хоть и простейший, но работает довольно забавно.<br />
Видео отчет:<br />
<div style="text-align: center;">
<object height="360" width="480"><param name="movie" value="//www.youtube.com/v/ZU9LYTwxFzw?hl=ru_RU&version=3"></param>
<param name="allowFullScreen" value="true"></param>
<param name="allowscriptaccess" value="always"></param>
<embed src="//www.youtube.com/v/ZU9LYTwxFzw?hl=ru_RU&version=3" type="application/x-shockwave-flash" width="480" height="360" allowscriptaccess="always" allowfullscreen="true"></embed></object>
</div>
</div>
Vasyl Yudinhttp://www.blogger.com/profile/05599352575777495536noreply@blogger.com0Тампа, Флорида, Соединенные Штаты Америки27.950575 -82.45717760000002327.4994965 -83.105371100000028 28.401653500000002 -81.808984100000018tag:blogger.com,1999:blog-703725759950508617.post-12111880464885191782013-09-17T17:16:00.000-07:002014-08-03T03:25:05.913-07:00Паяем датчик линии на CleClo:Proto<div dir="ltr" style="text-align: left;" trbidi="on">
Решил научить моего <a href="http://blockduino.blogspot.com/2013/08/usonic-rider.html">робота </a>ездить по линии, а для этого нужен соответствующий датчик, т.е. датчик яркости, который будет определять белая или черная поверхность под ним.<br />
<div>
Схему взял что попроще:</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjd_UtAQyVmaD16rP1_9JAzGtmQ9VmINgfb8rqp6pi-5i5r1DvPu4_6js2NP7FGkgniXR5ylC1yD1CW-KMfSep0etwRAuXrhZUshxAuMsQVKZI_5kEHqQc5JDPZso9GEP2_5UG0lv6brFR-/s1600/CleClo-Proto-LineFinder-Schem.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjd_UtAQyVmaD16rP1_9JAzGtmQ9VmINgfb8rqp6pi-5i5r1DvPu4_6js2NP7FGkgniXR5ylC1yD1CW-KMfSep0etwRAuXrhZUshxAuMsQVKZI_5kEHqQc5JDPZso9GEP2_5UG0lv6brFR-/s320/CleClo-Proto-LineFinder-Schem.png" height="231" width="320" /></a></div>
<div>
Т.е. список деталей следующий:<br />
<ul style="text-align: left;">
<li>инфракрасный светодиод</li>
<li>инфракрасный фотодиод</li>
<li>резистор 330 Ом, 0.125 Вт</li>
<li>резистор 10 кОм, 0.125 Вт</li>
<li>разъем 1х3 прямой (или угловой, кому как сподручнее)</li>
<li>платка <a href="http://blockduino.org/mediawiki/index.php?title=Proto" target="_blank">CleClo:Proto</a></li>
</ul>
<div>
Схемку нарисовал в программе EAGLE и прикинул как расположить эффективнее детальки и куда бросать перемычки, получилось очень даже ничего - компакненько:</div>
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKVGMst_m0bB14VMARh5CucuEfO0TUSSh2_Wx1HfQEGHQsdGmBqkUY4CCgQtOcjN53Q8FpHxwiM9dMCRZ_g1gbbFyZpSeTHUbcrxwwPGSZjiZEKAaksT2QgC6HuGKYxDJO04DjJ14Ks4QJ/s1600/CleClo-Proto+-+LineFinder_vert2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKVGMst_m0bB14VMARh5CucuEfO0TUSSh2_Wx1HfQEGHQsdGmBqkUY4CCgQtOcjN53Q8FpHxwiM9dMCRZ_g1gbbFyZpSeTHUbcrxwwPGSZjiZEKAaksT2QgC6HuGKYxDJO04DjJ14Ks4QJ/s400/CleClo-Proto+-+LineFinder_vert2.png" height="205" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Слева лицевая сторона, с детальками; справа - обратная, где перемычки.</td></tr>
</tbody></table>
<div class="separator" style="clear: both; text-align: center;">
</div>
<a name='more'></a><br />
<div class="separator" style="clear: both; text-align: left;">
Быстренько подпаял все в свои места. Перемычками пользоваться не пришлось, я имею ввиду проводками со стороны, для этих целей вполне подошли длинные ножки светодиодов.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://blockduino.org/mediawiki/images/4/45/CleClo-Proto-LineFinder.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://blockduino.org/mediawiki/images/4/45/CleClo-Proto-LineFinder.jpg" height="426" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
Светодиод светит постоянно, светит он в инфракрасном диапазоне невидимом человеческому глазу. Поэтому, чтобы определить светит он или нет, нужно посмотреть на него через фото/видео-камеру.</div>
<div>
Подключается этот датчик в аналоговый вход. Чтобы сразу проверить работоспособность датчика удобно использовать скетч в примерах программы Ардуино: [File->Examples->3.Analog->AnalogInOutSerial]. Подключить датчик к входу A0 и смотреть показания датчика в мониторе порта [Tools->Serial Monitor]. У меня при среднем освещении комнаты (а освещение влияет на датчик) белый лист бумаги определяется в пределах 700, а черная полоса напечатанная на лазерном принтере больше 900.</div>
<div>
В общем все работает, следующий шаг, прикрутить это к моему <a href="http://blockduino.blogspot.com/search/label/BDRider" target="_blank">BD Rider'у</a>.<br />
Что я и сделал: <a href="http://blockduino.blogspot.ca/2013/09/boundary-rider.html">Робот не выезжающий за черную линию - Boundary Rider</a></div>
<div>
<br /></div>
<div>
Файлы: схема и плата в формате EAGLE: <a href="http://www.blockduino.org/bd_files/CleClo-Proto-LineFinder.zip" target="_blank">CleClo-Proto-LineFinder.zip</a><br />
<br /></div>
</div>
Vasyl Yudinhttp://www.blogger.com/profile/05599352575777495536noreply@blogger.com0tag:blogger.com,1999:blog-703725759950508617.post-80501079462951744752013-08-27T13:56:00.001-07:002014-05-27T08:58:34.154-07:00Робот объезжающий препятствия пользуясь ультразвуковым датчиком расстояния - USonic Rider<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiR1EAPdGLmAPtngn4c-0_nYf7kQrrgg791n0Uy3tek_t_qkJBpNDnIzAyOL59ycTnZRpLsUBjIsu-cPWjuKxR30HkpqBLhb9FOhtYyJxLOXn5CNhvZ14KCHWWpzab7qVwB-rHiPzsI3rz2/s1600/USonic_Rider.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiR1EAPdGLmAPtngn4c-0_nYf7kQrrgg791n0Uy3tek_t_qkJBpNDnIzAyOL59ycTnZRpLsUBjIsu-cPWjuKxR30HkpqBLhb9FOhtYyJxLOXn5CNhvZ14KCHWWpzab7qVwB-rHiPzsI3rz2/s200/USonic_Rider.jpg" height="133" width="200" /></a></div>
Продолжаем экспериментировать с гусеничной платформой от Pololu.<br />
На этот раз едем куда попало в автономном режиме, но объезжаем препятствия используя ультразвуковой датчик расстояния. А раз автономно, то можем с чистой совестью считать эту машинку роботом.<br />
Машинка состоит из (слева направо):<br />
<ul style="text-align: left;">
<li><a href="http://blockduino.org/mediawiki/index.php?title=BlockDuino">Blockduino</a> </li>
<li><a href="http://blockduino.org/mediawiki/index.php?title=BlockMotor">BlockMotor</a> </li>
<li><a href="http://blockduino.org/mediawiki/index.php?title=PlugDIO">PlugDIO</a> </li>
<li><a href="http://www.odduino.com/publ/datchiki_sensory/set_ethernet/ultrazvukovoj_datchik_rasstojanija_arduino_ultrasonic_wave_detector_ranging_module_distance_sensor/11-1-0-46">Ultrasonic Range Detector</a></li>
</ul>
<div>
<a name='more'></a><br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOg3lRptK0ugOqomE8mnPWGTZ5FXJI1qNiPfOanQfYLfVK1SnWZ0Xp5rVStN5uz5kN5onuQ6JwlgQYHeiRftMRDhrbAM-zjx3BmDyUtP0uKR0lpJGU4HW4t3xzCL97xCKO9hCoMPi0YwHK/s1600/USonic_Rider_top_view.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOg3lRptK0ugOqomE8mnPWGTZ5FXJI1qNiPfOanQfYLfVK1SnWZ0Xp5rVStN5uz5kN5onuQ6JwlgQYHeiRftMRDhrbAM-zjx3BmDyUtP0uKR0lpJGU4HW4t3xzCL97xCKO9hCoMPi0YwHK/s640/USonic_Rider_top_view.jpg" height="424" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Ультрасоник подключил в свободные порта: пин Trig в порт D11, а пин Echo в порт D10.</div>
<div>
</div>
<table align="center" border="0" style="width: 100%px;"><tbody>
<tr> <td><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiH6V-snV_z4yWBhNcOuZMYT6Q71WD25xhzanOt8i_EDdS9AW7BpQYYqjwXBRx6WLIsDaLQktrMZ666-BzbXIMNiH07i-lTevdxHu71iWxstBdEgbNlpusoztvpFSxMUk4xTpwtcpM_61Pc/s1600/USonic_Rider_close_view_USonic.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiH6V-snV_z4yWBhNcOuZMYT6Q71WD25xhzanOt8i_EDdS9AW7BpQYYqjwXBRx6WLIsDaLQktrMZ666-BzbXIMNiH07i-lTevdxHu71iWxstBdEgbNlpusoztvpFSxMUk4xTpwtcpM_61Pc/s320/USonic_Rider_close_view_USonic.jpg" height="213" width="320" /></a></td> <td><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkpgWGpmCW5z8hsbVKsFC2ubmMxtt1lAqSMLXLAhBpH8UBg37Uv4EEegrm3LwS_hV1dUR9dIFZcC8tEfd2LzyJkzMnJl7TPMoK-WHZxnPb8kR2j-EEdcJiKq3LYkdCxCgCdd4-c_j4RKgA/s1600/USonic_Rider_front_view.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkpgWGpmCW5z8hsbVKsFC2ubmMxtt1lAqSMLXLAhBpH8UBg37Uv4EEegrm3LwS_hV1dUR9dIFZcC8tEfd2LzyJkzMnJl7TPMoK-WHZxnPb8kR2j-EEdcJiKq3LYkdCxCgCdd4-c_j4RKgA/s320/USonic_Rider_front_view.jpg" height="213" width="320" /></a></td> </tr>
</tbody></table>
<br />
Снова решил не изобретать велосипед и взял первый попавшийся алгоритм, найденный на сайте <a href="http://cyber-place.ru/">http://cyber-place.ru</a>.<br />
<br />
Алгоритм работы прост:<br />
<ul style="text-align: left;">
<li>замеряем расстояние</li>
<li>если расстояние меньше 10 см, то чуток поворачиваем в заданную сторону,</li>
<li>иначе если расстояние меньше 20 см, то поворачиваем уже чуть больше,</li>
<li>иначе если расстояние меньше 40 см, то поворачиваем совсем больше,</li>
<li>иначе считаем что путь свободен и едем вперед и меняем следующее направление поворота</li>
<li>начинаем все сначала;</li>
</ul>
Как ультрасоник замеряет расстояние описывать не буду, таких описаний много на просторах интернета, просто его работу вынес в отдельную подпрограмму LookAhead(), что можно перевести как: Посмотреть Вперед. :)<br />
<div>
<br /></div>
<!-- Начало спойлера--> <br />
<div style="margin: 5px 20px 20px;">
<div class="smallfont" style="margin-bottom: 2px;">
Код под спойлером: <input onclick="if (this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display != '') { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = ''; this.innerText = ''; this.value = 'Скрыть'; } else { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = 'none'; this.innerText = ''; this.value = 'Показать'; }" style="font-size: 10px; margin: 0px; padding: 0px; width: 60px;" type="button" value="Показать" /> </div>
<div class="alt2" style="-moz-background-clip: -moz-initial; -moz-background-inline-policy: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-size: auto auto; background-attachment: scroll; background-color: whitesmoke; background-image: none; background-position: 0% 50%; background-repeat: repeat; border: 1px inset; line-height: 1.5em; margin: 0px; padding: 6px;">
<div style="display: none;">
<!-- Начало вставки --> <br />
<pre><span style="color: #7e7e7e;">// UltraSonic Rider - по алгоритму "Робот объезжающий препятствия" сайта cyder-place.ru</span>
<span style="color: #7e7e7e;">// http://blockduino.org</span>
<span style="color: #7e7e7e;">// http://blockduino.blogger.com/2013/08/usonic-rider.html</span>
<span style="color: #7e7e7e;">// Август 2013</span>
#include <BDMotor.h> <span style="color: #7e7e7e;">//для BlockDuino и BlockMotor</span>
<span style="color: #7e7e7e;">//#include <AFMotor.h> //для Arduino и MotorShield</span>
#define SPEED 255 <span style="color: #7e7e7e;">// скорость вращения моторчиков, 255 - максимум</span>
#define ECHO_PIN 10 <span style="color: #7e7e7e;">// номер порта для ножки Echo</span>
#define PING_PIN 11 <span style="color: #7e7e7e;">// номер порта для ножки Ping (или Trig)</span>
<span style="color: #cc6600;">boolean</span> isCW = <span style="color: #cc6600;">true</span>; <span style="color: #7e7e7e;">// переменная для хранения направления поворота </span>
<span style="color: #cc6600;">double</span> dist; <span style="color: #7e7e7e;">// переменная для хранения дистанции</span>
<span style="color: #cc6600;">AF_DCMotor</span> mL(1); <span style="color: #7e7e7e;">// #1 моторчик левой гусеницы</span>
<span style="color: #cc6600;">AF_DCMotor</span> mR(2); <span style="color: #7e7e7e;">// #2 моторчик правой гусеницы</span>
<span style="color: #cc6600;">void</span> <span style="color: #cc6600;"><b>setup</b></span>() {
<span style="color: #cc6600;">pinMode</span>(ECHO_PIN, <span style="color: #006699;">INPUT</span>);
<span style="color: #cc6600;">pinMode</span>(PING_PIN, <span style="color: #006699;">OUTPUT</span>);
<span style="color: #cc6600;">digitalWrite</span>(PING_PIN, <span style="color: #006699;">LOW</span>);
mL.<span style="color: #cc6600;">setSpeed</span>(SPEED); <span style="color: #7e7e7e;">// устанавливаем скорость вращения левого моторчика</span>
mR.<span style="color: #cc6600;">setSpeed</span>(SPEED); <span style="color: #7e7e7e;">// устанавливаем скорость вращения правого моторчика</span>
}
<span style="color: #cc6600;">void</span> <span style="color: #cc6600;"><b>loop</b></span>() { <span style="color: #7e7e7e;">// Основное тело программы</span>
dist = LookAhead(); <span style="color: #7e7e7e;">// замеряем дистанцию</span>
<span style="color: #cc6600;">if</span>(dist < 10) Rotation(2000); <span style="color: #7e7e7e;">// если меньше 10 см максимальный угол разворота </span>
<span style="color: #cc6600;">else</span> <span style="color: #cc6600;">if</span>(dist < 20) Rotation(1000); <span style="color: #7e7e7e;">// иначе если меньше 20 см средний угол разворота </span>
<span style="color: #cc6600;">else</span> <span style="color: #cc6600;">if</span>(dist < 40) Rotation(500); <span style="color: #7e7e7e;">// иначе если меньше 40 см минимальный угол разворота </span>
<span style="color: #cc6600;">else</span> {
Run(); <span style="color: #7e7e7e;">// если пределы не достигнуты, то едем вперед</span>
isCW=!isCW; <span style="color: #7e7e7e;">// и меняем направление следующего поворота</span>
}
} <span style="color: #7e7e7e;">// конец основной программы, начинаем все сначала</span>
<span style="color: #7e7e7e;">//</span>
<span style="color: #7e7e7e;">// Подпрограммы</span>
<span style="color: #7e7e7e;">//</span>
<span style="color: #cc6600;">double</span> LookAhead(){ <span style="color: #7e7e7e;">// подпрограмма замера дистанции</span>
<span style="color: #cc6600;">double</span> duration;
<span style="color: #cc6600;">digitalWrite</span>(PING_PIN, <span style="color: #006699;">HIGH</span>); <span style="color: #7e7e7e;">// дергаем ножку на UltraSonic</span>
<span style="color: #cc6600;">delayMicroseconds</span>(10); <span style="color: #7e7e7e;">//</span>
<span style="color: #cc6600;">digitalWrite</span>(PING_PIN, <span style="color: #006699;">LOW</span>); <span style="color: #7e7e7e;">//</span>
duration = <span style="color: #cc6600;">pulseIn</span>(ECHO_PIN, <span style="color: #006699;">HIGH</span>)/ 58.824; <span style="color: #7e7e7e;">// Замеряем время импулься и переводим в расстояние в сантиметры</span>
<span style="color: #cc6600;">if</span> (duration > 140) duration = 140; <span style="color: #7e7e7e;">// Отсекаем ложные срабатывания</span>
<span style="color: #cc6600;">return</span> duration;
}
<span style="color: #cc6600;">void</span> Rotation(<span style="color: #cc6600;">int</span> t){ <span style="color: #7e7e7e;">// подпрограмма поворота</span>
<span style="color: #cc6600;">if</span> (isCW) TurnRight(); <span style="color: #7e7e7e;">// если переменная isCW правда (true) то поворачиваем направо, </span>
<span style="color: #cc6600;">else</span> TurnLeft(); <span style="color: #7e7e7e;">// иначе налево</span>
<span style="color: #cc6600;">delay</span>(t); <span style="color: #7e7e7e;">// ждем нужное время</span>
Stop(); <span style="color: #7e7e7e;">// останавливаемся</span>
}
<span style="color: #cc6600;">void</span> Stop(){ <span style="color: #7e7e7e;">// подпрограмма Остановка</span>
mL.<span style="color: #cc6600;">run</span>(<span style="color: #006699;">RELEASE</span>);
mR.<span style="color: #cc6600;">run</span>(<span style="color: #006699;">RELEASE</span>);
}
<span style="color: #cc6600;">void</span> Run(){ <span style="color: #7e7e7e;">// подпрограмма Ход вперед</span>
mL.<span style="color: #cc6600;">run</span>(<span style="color: #006699;">FORWARD</span>);
mR.<span style="color: #cc6600;">run</span>(<span style="color: #006699;">FORWARD</span>);
}
<span style="color: #cc6600;">void</span> TurnRight(){ <span style="color: #7e7e7e;">// подпрограмма Поворот направо</span>
mL.<span style="color: #cc6600;">run</span>(<span style="color: #006699;">FORWARD</span>);
mR.<span style="color: #cc6600;">run</span>(<span style="color: #006699;">BACKWARD</span>);
}
<span style="color: #cc6600;">void</span> TurnLeft(){ <span style="color: #7e7e7e;">// подпрограмма Поворот налево</span>
mR.<span style="color: #cc6600;">run</span>(<span style="color: #006699;">FORWARD</span>);
mL.<span style="color: #cc6600;">run</span>(<span style="color: #006699;">BACKWARD</span>);
}
</pre>
<!-- Конец вставки --> </div>
</div>
</div>
Хотелось бы осветить и недостатки такого робота:<br />
<br />
<ol style="text-align: left;">
<li>Ширина звукового луча сенсора заметно уже ширины шасси, поэтому есть шанс что робот въедет гусеницей в какой-то угол или ножку стула</li>
<li>Звук плохо отражается от пушистых поверхностей, например кот будет для робота невидим</li>
<li>Звук отразится от поверхностей находящихся под острым углом к оси робота не обратно, а уйдет в другую сторону, там погуляет и вернется с ложными данными, порой до нескольких метров место десятка сантиметров. Т.е. в нашем случае эти поверхности тоже невидимы.</li>
</ol>
<div>
<b>Вывод</b>: Ультрасоник вещь хорошая, но для робота нужны еще и другие датчики, например бампер или инфракрасные детекторы объектов.</div>
<div>
<br /></div>
<!-- Конец спойлера--> Небольшой видео отчет:<br />
<div style="text-align: center;">
<object height="360" width="480"><param name="movie" value="//www.youtube.com/v/XBGaB6vUd6I?version=3&hl=ru_RU"></param>
<param name="allowFullScreen" value="true"></param>
<param name="allowscriptaccess" value="always"></param>
<embed src="//www.youtube.com/v/XBGaB6vUd6I?version=3&hl=ru_RU" type="application/x-shockwave-flash" width="480" height="360" allowscriptaccess="always" allowfullscreen="true"></embed></object><br />
<br />
<div style="text-align: left;">
<b>Дополнительно</b>: Код расположенный на сайте <a href="https://codebender.cc/" target="_blank">Сodebender.cc</a></div>
<iframe allowtransparency="true" frameborder="0" src="https://codebender.cc/embed/sketch:36087" style="height: 510px; margin: 10px 0 10px; width: 100%;"></iframe><br /></div>
</div>
Vasyl Yudinhttp://www.blogger.com/profile/05599352575777495536noreply@blogger.com0