1. Blog>
  2. CircuitPython-compatible & Bluetooth-enabled STEM Electronics Kits --- ScoutMakes

CircuitPython-compatible & Bluetooth-enabled STEM Electronics Kits --- ScoutMakes

by: Nov 12,2020 4820 Views 0 Comments Posted in Activities

ScoutMakes CircuitPython Bluetooth STEM Electronics Kits radio robot

ScoutMakes is an open source, circuitPython-compatible and bluetooth-enabled STEM electronics kits. The whole kits are all certified open hardware and all source files are available on GitHub

The ScoutMakes FM Radio Kit and the ScoutMakes Robot Kit are provided. And each kit comes with all necessary mechanical hardware.

ScoutMakes Bluetooth Fun Kits

ScoutMakes Azul

At the heart of these kits is our ScoutMakes Azul board, which is an open source development platform that allows you to add Bluetooth Low Energy (BLE) capabilities to any project. Featuring the 32-bit ARM Cortex-M4 (nRF52840) processor from Nordic Semiconductors, it conforms to the AdaFruit Feather form factor, runs CircuitPython or Arduino, provides native support for USB Type-C, and includes a built-in 128 × 32 pixel OLED display.

Pre-programmed with a UF2 bootloader, the Azul board that arrives with your kit will be ready to run your code right out of the box! To test your code—or the sample code we provide—simply pair your ScoutMakes Azul board with AdaFruit’s Bluefruit application, which is available for both Android and iOS devices. Bluefruit includes a color picker, an eight-button controller, and the ability to pass along sensor measurements (including quaternion, accelerometer, gyroscope, magnetometer, and GPS data). It uses BLE to transmit instructions from your mobile device to the Azul board’s nRF52, which is then responsible for interpreting those instructions, whether you’re cranking up the volume on your radio, sending your robot careening across the room, or issuing commands to a creation of your very own.

Azul Features & Specifications

  • Powered by an ARM Cortex M4F (with hardware floating point acceleration) running at 64 MHz
  • 1 MB flash and 256 KB SRAM
  • Native open source USB stack, pre-programmed with UF2 bootloader
  • BLE-compatible 2.4 GHz radio
  • Up to +8 dBm output power
  • Built-in 128 x 32 pixel OLED display
  • NeoPixel LED
  • USB type-C connector
  • Built-in battery charger and 100 mAh LiPo battery
  • 1.7 to 3.3 V operation with internal linear and DC/DC voltage regulators
  • 21 GPIO, six 12-bit ADC pins, and up to 12 PWM outputs (three PWM modules with four outputs each)
  • A red LED for general-purpose blinking (pin #3) and a NeoPixel for multi-color visual feedback
  • A power switch
  • A reset button
  • Four mounting holes
  • Works out of the box with FeatherWing add-on boards

ScoutMakes FM Radio Kit

To make our FM Radio Kit as accessible and easy-to-use as possible, the RDA5807M chip has been chosen, which is a broadcast FM stereo tuner with a fully integrated synthesizer and a powerful low-IF digital audio processor—and we baked it into a PCB that complies with the Adafruit Feather standard. The chip is programmable by way of a CircuitPython library.

The ScoutMakes FM Radio Kit can also receive and process Radio Data Service (RDS) content. RDS is a communications protocol for embedding small amounts of digital data within conventional FM radio broadcasts. Examples include the time, the station identification, and programming information. (If you have a modern car stereo, you’ve probably seen RDS used to display the name of the song that is playing.)

FM Radio Kit Features & Specifications

  • RDA5807M single-chip FM receiver
  • Controllable over BLE using an iOS or Android app
  • Powered by the LiPo battery in the Azul board
  • High-quality stereo audio output
  • Built-in volume and bass control
  • Received signal strength indicator (RSSI) information
  • Station scanning and presets are supported in code
  • Radio Data Service (RDS) information available for display
  • Adafruit CircuitPython library
  • SparkFun Qwiic connector for easy, solderless attachment of other I2C devices
  • User-assignable push-buttons for control
  • 3.5 mm audio jack

ScoutMakes Robot Kit

With the ScoutMakes Robot kit, you will create a simple, wheeled robot while developing a familiarity with concepts like mechanical assembly and motor control. This kit also includes a piezoelectric buzzer and NeoPixels that allow your robot to play sounds and glow while it’s moving around.

And, thanks to the included Azul board, you’ll be able to send instructions to your robot, over BLE, from an app on your iOS or Android device. To control it, you can simply tilt your device in the direction of travel.

Robot Kit Features & Specifications

  • Quick and easy assembly (includes an assembly guide and all necessary mechanical hardware)
  • Controllable over BLE using an iOS or Android app
  • A piezoelectric speaker allows your robot to make sounds
  • Powered by the LiPo battery in the Azul board
  • Four NeoPixels on the robot board provide illumination
  • Modify the source files for the robot chassis and 3D print your own designs
  • Quality, N20 motors with metal gear boxes and rubber tires


The ScoutMakes STEM Education Kits is designed by TinkeringTech, and it is currently in the crowdfunding stage in CrowdSupply. Go to support it if you are interested in it!

Join us
Wanna be a dedicated PCBWay writer? We definately look forward to having you with us.
  • Comments(0)
Upload photo
You can only upload 5 files in total. Each file cannot exceed 2MB. Supports JPG, JPEG, GIF, PNG, BMP
0 / 10000
    '; html += ' '; html += ' '; html += '
    '; html += '
    0 /' + commentObj.max_count + '
    '; html += '
    '; html += '
    '; html += '
    '; html += '
    '; html += ''; html += ''; html += ''; html += '
    '; html += '
    '; html += ' '; html += ' '; html += '
    '; html += '
    '; html += ''; $('#div-three-' + id).children('div').append(html).show(); commentObj.fn_uploader(id); } }, //取消添加留言 fn_cancel_msg: function (obj) { $(obj).parents('.js-son-comments').hide(); }, //删除自己的留言 fn_del_msg: function (level, id) { if (!commentObj.isLogin) { //弹出登录框 layerLogin(); return false; } layer.confirm($('#JsA10').val(), function (index) { $.getJSON(commentObj.fn_del_comment_url(), { msgid: id }, function (res) { if (res.result) { if (level == 1) { //if (ispage > 0) // window.location.reload(); $('#li' + id).remove(); commentObj.fn_up_level_msg_cnt(level, id, -1); } else { var obj = $('#' + (level == 1 ? 'li' : 'div-three-') + id); var num = parseInt(obj.parents('li').find('b').text()); num += -1; if (num < 0) { num = 0; } var parobj = $('#div-three-' + id).parent(); obj.parents('li').find('b').text(num); $('#div-three-' + id).remove(); if (parobj.find('.sub-comment').length > 0) { } else { parobj.parent().hide(); } } commentObj.fn_up_msg_cnt(-1); layer.close(index); } else if (res.msg == "nothing") { layer.alert("error"); return; } else if (res.msg == "havereply") { layer.alert($('#JsA11').val()); return; } else { layer.alert($('#JsA12').val()); return; } }); }) }, //更新留言数量 fn_up_msg_cnt: function (val) { var num = parseInt($('#MsgCount').text()); num += parseInt(val); if (num < 0) { num = 0; } $('#MsgCount').text(num); }, //更新留言数量level fn_up_level_msg_cnt: function (level, id, val) { var obj = $('#' + (level == 1 ? 'li' : 'div-three-') + id); var num = parseInt(obj.parents('li').find('b').text()); num += parseInt(val); if (num < 0) { num = 0; } obj.parents('li').find('b').text(num); }, fn_mark_comment: function (obj, islike, commentid) { if (logintype != 1) { layerLogin(); return; } $.getJSON($('#memberurl').val() + '/Project/CommentMark?callback=?', { id: commentObj.obj_id, ProjectType: commentObj.obj_type, isLike: islike, commentid: commentid }, function (res) { if (res.result) { var markCnt = parseInt($('#commentMarkCnt' + commentid).text()); if ($(obj).hasClass('active')) { $(obj).removeClass('active'); if (islike) { $('#commentMarkCnt' + commentid).text(markCnt - 1); } else { $('#commentMarkCnt' + commentid).text(markCnt + 1); } } else { if ($(obj).parent().find('dl').hasClass('active')) { if (islike) { $('#commentMarkCnt' + commentid).text(markCnt + 2); } else { $('#commentMarkCnt' + commentid).text(markCnt - 2); } $(obj).parent().find('dl').removeClass('active'); } else { if (islike) { $('#commentMarkCnt' + commentid).text(markCnt + 1); } else { $('#commentMarkCnt' + commentid).text(markCnt - 1); } } $(obj).addClass('active'); } } else if (res.msg == "nologin") { //弹出登录框 layerLogin(); } else layer.alert("error"); }); }, //加载数据 fn_load_data: function (page) { $('#commentload').show(); $.ajax({ url: commentObj.fn_get_comment_url(), dataType: 'jsonp', data: { objid: commentObj.obj_id, objtype: commentObj.obj_type, page: page }, success: function (jason) { var totalpage = jason.TotalCount / 20; if (totalpage % 1 > 0) totalpage = parseInt(totalpage) + 1; if (page >= totalpage) { $('#commentviewmore').parent().remove(); } else { $('#commentviewmore').parent().show(); } if (jason.TotalCount > 0) { page = jason.PageIndex; var msgList = jason.DataList; var html = ''; if (msgList && msgList.length > 0) { for (var item in msgList) { html += '
  • '; if (commentObj.is_project == 1 && commentObj.obj_type == 6) { html += '
    '; html += '
    '; html += '
    '; html += '
    ' + msgList[item].MarkCnt + '
    '; html += '
    '; html += '
    '; html += '
    '; html += '
    '; html += '
    ' + (msgList[item].MbId > 0 ? msgList[item].ContactName : msgList[item].Name == "" ? msgList[item].Email : msgList[item].Name) + '
    '; } else { html += ''; html += '' html += ''; html += ''; html += '' html += '
    ' + (msgList[item].MbId > 0 ? msgList[item].ContactName : msgList[item].Name == "" ? msgList[item].Email : msgList[item].Name) + '
    '; } html += '

    '; html += msgList[item].Note; html += '

    '; if (msgList[item].MsgPic && msgList[item].MsgPic != '') { html += '
    ' var msgpicArr = msgList[item].MsgPic.split(','); for (var i = 0; i < msgpicArr.length; i++) { html += '
    ' html += ""; html += '
    '; } html += '
    '; } // html += ''; html += ''; // html += '
    '; html += '
    '; var ReplyList = msgList[item].ReplyList; if (ReplyList && ReplyList.length > 0) { for (var reply in ReplyList) { html += '
    '; html += '
    '; html += '
    '; html += '' + ReplyList[reply].ContactName + ' '; html += '' + ReplyList[reply].AddTimeStr + ''; html += ''; html += '' + $('#JsA13').val() + ''; if (ReplyList[reply].IsMy && ((new Date() - new Date(ReplyList[reply].AddTime)) / (1000 * 60 * 60)) <= 5 && (!ReplyList[reply].ReplyList || ReplyList[reply].ReplyList.length == 0)) { html += ' ' + $('#JsA14').val() + ''; } html += ''; html += '
    '; html += '
    '; if (ReplyList[reply].ReplyCommentId > 0 && ReplyList[reply].ReplyCommentId != msgList[item].Id) { html += '
    '; html += $('#JsA13').val() + '@ ' + ReplyList[reply].ReplyContactName + ':'; html += '
    '; } html += '

    ' + ReplyList[reply].Note + '

    '; if (ReplyList[reply].MsgPic && ReplyList[reply].MsgPic != '') { html += '
    ' var msgpicArr = ReplyList[reply].MsgPic.split(','); for (var i = 0; i < msgpicArr.length; i++) { html += '
    ' html += ""; html += '
    '; } html += '
    '; } html += '
    '; html += '
    '; html += '
    '; } } html += '
    '; if (msgList[item].ReplyList && msgList[item].ReplyList.length > 0) { html += ''; } html += '
    '; html += '
    '; if (msgList[item].MbId > 0) { html += '' + $('#JsA13').val() + ''; } // if (msgList[item].IsMy && ((new Date() - new Date(msgList[item].AddTime)) / (1000 * 60 * 60)) <= 5 && (!msgList[item].ReplyList || msgList[item].ReplyList.Count == 0)) { html += ' ' + $('#JsA14').val() + ''; } html += '
    '; html += '
  • '; } $('#commentload').hide(); $('#comment_ul').append(html); } } $('#commentload').hide(); }, error: function (xhr, status, error) { $('#commentload').hide(); } }); }, //保存数据 fn_save_msg: function (level, id) { var msg = $('#msg-' + id).val(); var msgpic = commentObj.getPicImgArr(id); if (msg && msg.length > 10000) { $('#msg-' + id).addClass('form-error'); return false; } else if (msg && msg.length > 0) { //msg = commentObj.convertToHTMLFn(msg); } if ((msg && msg.length > 0) || msgpic.length > 4) { $('body').addClass('global-loading'); $.ajax({ url: commentObj.fn_save_comment_url(), //dataType: 'jsonp', type: 'POST', data: { msg: msg, replyid: id, objid: commentObj.obj_id, msgpic: msgpic, objtype: commentObj.obj_type, isproject: commentObj.is_project }, crossDomain: true, xhrFields: { withCredentials: true }, success: function (res) { if (res.result) { //if (ispage > 0) { // window.location.reload(); // return; //} //js加载,不刷新页面,增强体验 $('#msg-' + id).val(""); if (level == 1) { $('.js-add-comment .js-words').css({ 'color': '#999' }).text(0); } else { $('#msg-' + id).next().find('.js-words').css({ 'color': '#999' }).text(0); } if (level == 1) { $('#js-views-example' + id).html(""); //第一级留言(直接回复文章) var objtype = parseInt($('#hidobjtype').val()); var html = '
  • '; if (commentObj.is_project == 1 && commentObj.obj_type == 6) { html += '
    '; html += '
    '; html += '
    '; html += '
    0
    '; html += '
    '; html += '
    '; html += '
    '; html += '
    '; html += '
    ' + commentObj.fn_get_username(escape(res.msg.ContactName)) + '
    '; } else { html += ''; html += '
    ' + commentObj.fn_get_username(escape(res.msg.ContactName)) + '
    '; } html += '

    '; html += res.msg.Note; html += '

    '; if (res.msg.MsgPic && res.msg.MsgPic != '') { var msgpicArr = res.msg.MsgPic.split(','); html += '
    ' for (var i = 0; i < msgpicArr.length; i++) { html += '
    ' html += ""; html += '
    '; } html += '
    '; } // html += ''; html += ''; html += ''; html += '
    '; html += '' + $('#JsA13').val() + ' '; html += '' + $('#JsA14').val() + ''; html += '
    '; html += '
  • '; $('#comment_ul').prepend(html); commentObj.fn_up_msg_cnt(1); //commentObj.fn_up_level_msg_cnt(1, res.msg.Id, 1); //if (ispage == 0) // $("html,body").animate({ scrollTop: $("#li" + res.msg.Id).offset().top - 70 }, 1000); } else { $('#js-views-example' + res.msg.Id).html(""); //第二级留言(回复第一级留言) var html = '
    '; html += '
    '; html += '
    '; html += '' + commentObj.fn_get_username(escape(res.msg.ContactName)); html += ''; html += ' ' + res.msg.AddTimeStr; html += ''; html += ''; html += '' + $('#JsA13').val() + ' '; html += '' + $('#JsA14').val() + ''; html += ''; html += '
    '; html += '
    '; if (level == 3) { //第三级留言(回复第二级留言) html += ''; } html += '

    ' + res.msg.Note + '

    '; if (res.msg.MsgPic && res.msg.MsgPic != '') { html += '
    ' var msgpicArr = res.msg.MsgPic.split(','); for (var i = 0; i < msgpicArr.length; i++) { html += '
    ' html += ""; html += '
    '; } } html += '
    '; html += '
    '; html += '
    '; html += '
    '; if (level == 3) { //第三级留言(回复第二级留言) commentObj.fn_add_reply(3, id); $('#div-three-' + id).parent('div').append(html); } else { commentObj.fn_add_reply(2, id); $('#div-two-' + id).show().children('div').append(html); } commentObj.fn_up_msg_cnt(1); commentObj.fn_up_level_msg_cnt(level, res.msg.Id, 1); } commentObj.fn_uploader(id); $('#error-tips').hide(); $('#msg-' + id).removeClass('form-error'); $('#error-tips-img' + id).hide(); $('#error-tips-img-size' + id).hide(); $('#error-tips-img-type' + id).hide(); } else if (res.msg == "nologin") { //弹出登录框 layerLogin(); } else { layer.alert("error"); } $('body').removeClass('global-loading'); }, error: function (xhr, status, error) { if (xhr.status == 403) { layer.alert("Amazon Firewall Warning: 403 Forbidden - Content may contain sensitive or dangerous words."); } $('body').removeClass('global-loading'); } }); } else { $('#msg-' + id).addClass('form-error'); if (!$('#msg-' + id).hasClass('js-mention')) $('#error-tips').show().Shake(4, 10); return false; } }, //上传文件 fn_uploader: function (id) { /*上传文件开始*/ var uploader = WebUploader.create({ // 选完文件后,是否自动上传。 auto: true, // swf文件路径 swf: '/img/js/jqueryplus/webuploader-0.1.5/Uploader.swf', // 文件接收服务端。 server: '/Common/UpFile', // 选择文件的按钮。可选。 // 内部根据当前运行是创建,可能是input元素,也可能是flash. pick: { id: '#msgFile' + id, multiple: false }, fileVal: 'FileData', fileNumLimit: 5, fileSingleSizeLimit: '2097152',//'10485760',5242880,2097152 accept: { title: 'File', extensions: 'bmp,png,gif,jpg,jpeg', mimeTypes: 'image/*' }, 'formData': { 'uptype': "blogfile", 'key': "", 'checkcode': "", "getjson": true }, }); uploader.on('beforeFileQueued', function (file) { $('#error-tips').hide(); $('#msg-' + id).removeClass('form-error'); $('#error-tips-img' + id).hide(); $('#error-tips-img-type' + id).hide() $('#error-tips-img-size' + id).hide() }); uploader.on('uploadStart', function (file, percentage) { if (logintype != 1) { layerLogin(); return; } $("#progress-box" + id).show(); }); uploader.on('uploadProgress', function (file, percentage) { $('.progress').attr('data-percent', parseInt(percentage * 80)) }); uploader.on('uploadSuccess', function (file, data) { if (data.state === "SUCCESS") { var tempImg = '
    '; tempImg += ''; tempImg += '
    '; tempImg += '
    '; $('#js-views-example' + id).show().append(tempImg) } $('.progress').attr('data-percent', parseInt(0)) $("#progress-box" + id).hide(); // 上传图预览 $(document).on('click', '.js-views-example .del-pic', function () { var fileid = $(this)[0].id; var file = uploader.getFile(fileid) if (file) { uploader.removeFile(file, true); // 删除文件 } $(this).parent().remove(); $('#error-tips').hide(); $('#msg-' + id).removeClass('form-error'); $('#error-tips-img' + id).hide(); $('#error-tips-img-size' + id).hide(); $('#error-tips-img-type' + id).hide(); }) }); uploader.on('error', function (str) { if (str == "Q_EXCEED_NUM_LIMIT") { $('#error-tips-img' + id).show().Shake(4, 10); } else if (str == "Q_TYPE_DENIED") { $('#error-tips-img-type' + id).show().Shake(4, 10); } else if (str == "F_EXCEED_SIZE") { $('#error-tips-img-size' + id).show().Shake(4, 10); } setTimeout(function () { $('#error-tips-img' + id).hide(); $('#error-tips-img-size' + id).hide(); $('#error-tips-img-type' + id).hide(); }, 3000); }); /*上传文件结束*/ }, // 文本域转html convertToHTMLFn: function (text) { return text.replace(/\n/g, '
    ').replace(/ /g, ' '); }, getPicImgArr: function (id) { var imgpicarr = []; $("img[name='pig-img" + id + "']").each(function (i, e) { imgpicarr.push(e.src); }) return imgpicarr.length > 0 ? imgpicarr.join(',') : ""; } } commentObj.fn_init(); -->
    Back to top
    OSZAR »