{"id":926,"date":"2016-06-28T00:38:40","date_gmt":"2016-06-27T23:38:40","guid":{"rendered":"http:\/\/ofalcao.pt\/blog\/?p=926"},"modified":"2016-06-28T00:56:12","modified_gmt":"2016-06-27T23:56:12","slug":"lego-wedo-2-0-playing-sound","status":"publish","type":"post","link":"https:\/\/ofalcao.pt\/blog\/2016\/lego-wedo-2-0-playing-sound","title":{"rendered":"LEGO WeDo 2.0 &#8211; playing sound"},"content":{"rendered":"<div class=\"seriesmeta\">This post is part 4 of 6 of \u00a0<a href=\"https:\/\/ofalcao.pt\/blog\/series\/wedo-2-0-reverse-engineering\" class=\"series-269\" title=\"WeDo 2.0 - reverse engineering\">WeDo 2.0 - reverse engineering<\/a><\/div><p>Great news &#8211; LEGO Eduction released the <a href=\"https:\/\/education.lego.com\/en-us\/support\/wedo-2\/developer-kits\">WeDo 2.0 SDK<\/a> today!<\/p>\n<p>After digging into it, I found the information needed to control the Piezo: as expected, it&#8217;s controlled by the same handle that is used for controlling the motor and the RGB LED (0x003d). The &#8220;port&#8221; is &#8220;05&#8221; and the &#8220;command&#8221; to activate the Piezo is &#8220;02&#8221;, followed by a payload of &#8220;04&#8221; bytes containing:<\/p>\n<ul>\n<li style=\"padding-left: 30px;\">the Frequency in Hz (2 bytes, reversed)<\/li>\n<li style=\"padding-left: 30px;\">the duration in ms (2 bytes, reversed)<\/li>\n<\/ul>\n<p>So to play a &#8220;C&#8221; (or &#8220;Do&#8221;, 261 Hz) during 1\/8 of a second (125 ms) we use this command:<\/p>\n<pre>[A0:E6:F8:1E:58:57][LE]&gt; char-write-cmd 003d 050204B801E803<\/pre>\n<p>So let&#8217;s hear the very first music played by a WeDo 2.0 from a linux shell script:<\/p>\n<div class=\"jetpack-video-wrapper\"><iframe loading=\"lazy\" title=\"LEGO WeDo 2.0 Piezo control\" width=\"840\" height=\"473\" src=\"https:\/\/www.youtube.com\/embed\/w4xRCM4auB4?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/div>\n<pre>#!\/usr\/bin\/env bash\r\n\r\n# In Ubuntu run this script with sudo\r\n# \"Imperial March on a WeDo 2.0\" was inspired by https:\/\/gist.github.com\/tagliati\/1804108\r\n\r\n# command: gatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 050204\r\n\r\n# beep(a, 500) \r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 050204B801F401\r\nsleep 0.5\r\n\r\n# beep(a, 500) \r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 050204B801F401\r\nsleep 0.5\r\n\r\n# beep(a, 500) \r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 050204B801F401\r\nsleep 0.5\r\n\r\n# beep(f, 350)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 0502045D015E01\r\nsleep 0.35\r\n\r\n# beep(cH, 150)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 0502040B029600\r\nsleep 0.15\r\n\r\n# beep(a, 500)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 050204B801F401\r\nsleep 0.5\r\n\r\n# beep(f, 350)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 0502045D015E01\r\nsleep 0.35\r\n\r\n# beep(cH, 150)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 0502040B029600\r\nsleep 0.15\r\n\r\n# beep(a, 1000)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 050204B801E803\r\nsleep 1.0\r\n\r\n# beep(eH, 500)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 0502049302F401\r\nsleep 0.5\r\n\u00a0\u00a0 \u00a0\r\n# beep(eH, 500)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 0502049302F401\r\nsleep 0.5\r\n\r\n# beep(eH, 500)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 0502049302F401\r\nsleep 0.5\r\n\r\n# beep(fH, 350) \r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 050204BA025E01\r\nsleep 0.35\r\n\r\n# beep(cH, 150)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 0502040B029600\r\nsleep 0.15\r\n\r\n# beep(gS, 500)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 0502049F01F401\r\nsleep 0.5\u00a0\u00a0 \u00a0\r\n\r\n# beep(f, 350)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 0502045D015E01\r\nsleep 0.35\r\n\r\n# beep(cH, 150)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 0502040B029600\r\nsleep 0.15\r\n\r\n# beep(a, 1000)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 050204B801E803\r\nsleep 1.0\r\n\u00a0\r\n# beep(aH, 500)\u00a0 \u00a0\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 0502047003F401\r\nsleep 0.5\r\n\r\n# beep(a, 350) \r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 050204B8015E01\r\nsleep 0.35\r\n\r\n# beep(a, 150)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 050204B8019600\r\nsleep 0.15\r\n\r\n# beep(aH, 500)\u00a0 \u00a0\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 0502047003F401\r\nsleep 0.5\r\n\r\n# beep(gSH, 250)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 0502043E03FA00\r\nsleep 0.25\r\n\r\n# beep(gH, 250)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 0502041003FA00\r\nsleep 0.25\r\n\r\n# beep(fSH, 125)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 050204E4027D00\r\nsleep 0.125\r\n\r\n# beep(fH, 125) \r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 050204BA027D00\r\nsleep 0.125 \u00a0\r\n\u00a0 \u00a0\r\n# beep(fSH, 250)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 050204E402FA00\r\nsleep 0.25\r\n\r\n# delay(250)\r\nsleep 0.25\r\n\r\n# beep(aS, 250)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 050204C701FA00\r\nsleep 0.25\r\n\r\n# beep(dSH, 500)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 0502046E02F401\r\nsleep 0.5\r\n\r\n# beep(dH, 250) \u00a0\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 0502044B02FA00\r\nsleep 0.25\r\n\r\n# beep(cSH, 250) \u00a0\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 0502042A02FA00\r\nsleep 0.25\r\n\r\n# beep(cH, 125)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 0502040B027D00\r\nsleep 0.125\r\n\r\n# beep(b, 125)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 050204D2017D00\r\nsleep 0.125\r\n\r\n# beep(cH, 250)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 0502040B02FA00\r\nsleep 0.25\r\n\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n# delay(250)\r\nsleep 0.25\r\n\r\n# beep(f, 125)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 0502045D017D00\r\nsleep 0.125\r\n\r\n# beep(gS, 500)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 0502049F01F401\r\nsleep 0.5\r\n\r\n# beep(f, 375) \r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 0502045D017701\r\nsleep 0.375\r\n\r\n# beep(a, 125)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 050204B8017D00\r\nsleep 0.125\r\n\u00a0 \r\n# beep(cH, 500)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 0502040B02F401\r\nsleep 0.5\r\n\r\n# beep(a, 375)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 050204B8017701\r\nsleep 0.375\r\n\r\n# beep(cH, 125)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 0502040B027D00\r\nsleep 0.125\r\n\r\n# beep(eH, 1000)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 0502049302E803\r\nsleep 1.0\r\n\r\n# beep(aH, 500)\u00a0 \u00a0\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 0502047003F401\r\nsleep 0.5\r\n\r\n# beep(a, 350) \r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 050204B8015E01\r\nsleep 0.35\r\n\r\n# beep(a, 150)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 050204B8019600\r\nsleep 0.15\r\n\r\n# beep(aH, 500)\u00a0 \u00a0\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 0502047003F401\r\nsleep 0.5\r\n\r\n# beep(gSH, 250)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 0502043E03FA00\r\nsleep 0.25\r\n\r\n# beep(gH, 250)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 0502041003FA00\r\nsleep 0.25\r\n\r\n# beep(fSH, 125)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 050204E4027D00\r\nsleep 0.125\r\n\u00a0\u00a0 \u00a0\r\n# beep(fH, 125) \r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 050204BA027D00\r\nsleep 0.125\r\n\r\n# beep(fSH, 250)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 050204E402FA00\r\nsleep 0.25\r\n\r\n# delay(250)\r\nsleep 0.25\r\n\r\n# beep(aS, 250)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 050204C701FA00\r\nsleep 0.25\r\n\r\n# beep(dSH, 500)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 0502046E02F401\r\nsleep 0.5\r\n\r\n# beep(dH, 250) \u00a0\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 0502044B02FA00\r\nsleep 0.25\r\n\r\n# beep(cSH, 250) \u00a0\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 0502042A02FA00\r\nsleep 0.25\r\n\r\n# beep(cH, 125)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 0502040B027D00\r\nsleep 0.125\r\n\r\n# beep(b, 125)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 050204D2017D00\r\nsleep 0.125\r\n\r\n# beep(cH, 250)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 0502040B02FA00\r\nsleep 0.25\r\n\r\n# delay(250)\r\nsleep 0.25\r\n\r\n# beep(f, 250)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 0502045D01FA00\r\nsleep 0.25\r\n\r\n# beep(gS, 500)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 0502049F01F401\r\nsleep 0.5 \r\n\u00a0 \r\n# beep(f, 375)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 0502045D017701\r\nsleep 0.375\r\n\r\n# beep(cH, 125)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 0502040B027D00\r\nsleep 0.125\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n# beep(a, 500)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 050204B801F401\r\nsleep 0.5\r\n\r\n# beep(f, 375)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 0502045D017701\r\nsleep 0.375\r\n\r\n# beep(c, 125)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 05020405017D00\r\nsleep 0.125\r\n\r\n# beep(a, 1000)\r\ngatttool -i hci0 -b A0:E6:F8:1E:58:57 --char-write-req -a 0x003d -n 050204B801E803\r\nsleep 1.0\r\n\u00a0\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"seriesmeta\">This post is part 4  of 6 of \u00a0<a href=\"https:\/\/ofalcao.pt\/blog\/series\/wedo-2-0-reverse-engineering\" class=\"series-269\" title=\"WeDo 2.0 - reverse engineering\">WeDo 2.0 - reverse engineering<\/a><\/div><p>Great news &#8211; LEGO Eduction released the WeDo 2.0 SDK today! After digging into it, I found the information needed to control the Piezo: as expected, it&#8217;s controlled by the same handle that is used for controlling the motor and the RGB LED (0x003d). The &#8220;port&#8221; is &#8220;05&#8221; and the &#8220;command&#8221; to activate the Piezo &hellip; <a href=\"https:\/\/ofalcao.pt\/blog\/2016\/lego-wedo-2-0-playing-sound\" class=\"more-link\">Continuar a ler<span class=\"screen-reader-text\"> &#8220;LEGO WeDo 2.0 &#8211; playing sound&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false},"version":2}},"categories":[38,39,233,154,18,148,20,96,26,156,265,271],"tags":[272],"series":[269],"class_list":["post-926","post","type-post","status-publish","format-standard","hentry","category-ble","category-bluetooth","category-bluetooth-pt","category-lego-en","category-lego","category-linux-en","category-linux","category-power-functions","category-ubuntu","category-ubuntu-en","category-wedo","category-wedo-2-0","tag-piezo","series-wedo-2-0-reverse-engineering"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p2Mhyv-eW","_links":{"self":[{"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/posts\/926","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/comments?post=926"}],"version-history":[{"count":0,"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/posts\/926\/revisions"}],"wp:attachment":[{"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/media?parent=926"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/categories?post=926"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/tags?post=926"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/ofalcao.pt\/blog\/wp-json\/wp\/v2\/series?post=926"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}