
本帖最后由 QianFan 于 2015-6-23 12:34 编辑 ) X& j6 L% g/ ^$ u8 v& M1 W+ p- c+ i ) Q, s5 K6 \& @, U# ~, y 不知道大家有没有听说的Scratch: http://scratch.mit.edu/ 是由麻省理工开发的一个软件,帮助孩子们从零开始学习编程。图形化的程序设计,萌萌哒的界面,想必能够吸引住众多孩子。不过这么好的软件貌似在国内知名度不高。 ![]() 后来,一个团队开发了一个名为S4A(Scartch for Arduino)的软件:http://s4a.cat/ 将Scartch与Arduino连接起来。结合了Scartch的编程优点,外加Arduino的众多传感器,一时间孩子们也能够玩转舵机,开关,以及模拟量的传感器了。S4A使用了Arduino的6路AD采集接口,3路PWM接口和3路舵机接口,方便小孩子连接传感器,实现自己的设计。4 b9 f' S4 h- s$ g* ` ![]() 后来,我觉得S4A这个玩意挺好玩的,看了一下桌子上的Nucleo,决定来移植一下。经过大约3天的紧张工作,终于成功完成了移植。期间出了一个小小的问题耗费了大约一天的时间。也就是Nucleo和S4A通讯的时候,S4A总是崩溃,一直未响应。不知道是什么原因,期间一直在改动自己的代码。一天无果。第二天无意间换了FT232作为串口通讯的工具。竟然奇迹般的好了。事后发现,只要是Nucleo的串口,不出几分钟,S4A必然崩溃。不知道是Nucleo串口的原因还是S4A的原因。 在移植完之后,我简单的用S4A写了一个呼吸灯的程序,突然发现,用C很容易实现的东西,让我来拖拽的时候竟然不知道如何去做了。。。0 A8 @: e- _: u" G- P 下面是程序截图:2 @* _: d d1 d* ~! e3 w8 G! T ![]() 最后,给大家上传一小段视频看一下(由于社区限制,只能将视频分成两个压缩包上传),感兴趣点个赞,不感兴趣路过好了。/ y( [) c0 N/ ]* _) [/ E* L# k 3 C: o( b. i: e7 l r0 I ---------------------------------------------------------------------------------------------------------------------------------------------------------------------) D* \# E- X. m1 M Nucleo334的软件包以上传到社区。欢迎大家下载试用。 发帖的时候占用了3层楼。对这几层的规划:
. d6 J8 ~* S% H: ~7 J! X ---------------------------------------------------------------------------------------------------------------------------------------------------------------------& b, p2 A2 `! r" z0 n2 M 软件包已经上传,名为S4Nu.rar(Scartch for Nucleo)欢迎大家提前下载使用。另外需要特别注意的是:虽然Nucleo自带了串口,但是在与S4A连接的时候不要使用这个串口。也不要使用USB连线将Nucleo与电脑相连。 应该对Nucleo使用外部供电。并使用USB转串口工具,例如CP2102,FT232等连接电脑与Nucleo的串口。具体是什么原因暂时还未知。可能在接下来的几天内能够解决这个问题,也可能解决不掉。下面就要说说如何设置Nucleo的硬件部分:% Q5 W& b1 h: _, |7 s0 u7 Z. T
4 @1 v, R0 x1 G, G3 d8 ]2 S6 I4 K
因通讯的问题,给老外的技术支持发了一封邮件,几天后,收到了一个回复,大概意思说是他们的S4A只是为Arduino Uno和Duemienova定做的,并且在今后的升级中,会考虑兼容更多的板子。本以为这件事就这样算了。/ ~# L$ v% [# Z. p$ |" d ![]() 没想到,另一个人,猜测大概是S4A的开发人员,给回复了一封邮件。意思是他正在考虑让S4A在LPC的ARM处理器上工作。让我发送一下我的代码,说不定他可以检查到什么错误。好消息,给你吧。 ![]() 在发送完STM32的代码之后,静等了几天,昨晚收到了邮件回复:也没看出是什么软件的问题,大概是USB转串口的问题吧。5 t. Y5 [/ _9 E2 g$ c; \6 J ![]() |
3 o; [% S: k; r* u+ `
如果你代码下载完毕,串口连接完成,打开S4A之后,就可以看到6路AD模拟量和两个开关的数字量的值了。图中的COMx是你实际使用的串口。在我的电脑上,这个COM3是使用FT232转换出来的。还要注意图片中的旗帜的标志和那个红色的大圆点。旗帜代表运行我们使用S4A拖拽的程序,圆点代表停止。
在S4A的左上角可以看到动作,控制,外观,等等控件。里面有各种各样的工具供我们使用。
- 动作一栏含有数字引脚的输出,舵机控制,pwm输出等。是对硬件的实际控制。
- 控制一栏中是常见的循环,if else分支语句,延时等函数。
- 数字和逻辑运算里面含有常用的大于小于判断,加减乘除等语法。
- 变量一栏中可以设置一个自己的变量,用于存储AD的采集值,pwm的输出值等等。更奇葩的是,还有链表这个东西。一直搞不清楚对小孩子而言,链表可以干什么。. a0 g7 \, W, J! i2 W& t4 x$ D
( y) }2 x- h$ o脚本这个位置就是我们写程序的地方。只要将程序按照逻辑结构放在这里就可以。一定要注意的是,开始的语句是一个“当旗帜被点击”的语句。这条语句类似于C语言中的main函数,程序开始执行的地方。下面就来简单的写一个闪灯的程序。
这就是我们平时在单片机中常写的Hello world程序。是不是很简单呢?如果想修改延时的时间怎么办?双击“等待1秒”中的1,然后填上你想要的时间并按回车。这个时间是小数的形式。可以是0.1 。+ `2 D' v) S$ Z) X3 o
我们平时在写程序的时候,经常会设置一个变量,用于存储延时的时间。在S4A中,变量的设置也是支持的。在变量一栏中点击“新建一个变量”,之后填上变量的名字,就出现很多关于这个变量操作的控件。比如设置变量的值,将变量增加一个数值等等。可是,为什么没有减小变量的数值呢?其实只要将“将变量delayTime的值增加[]”中的空格处填写一个负数就可以了。比如-10 。可是小孩子如果不知道负数怎么办呢?. k6 ~& z3 k; C9 R# L. B
在程序写完之后,点击右上角圆点旁边的旗帜图标就可以运行了。
不知道你家孩子会不会喜欢上!9 Q$ w9 I$ {# }" {; k2 c, @
2 \! I) l2 P; ^2 L5 a4 |" n
/ q9 g# g/ i4 c! ?# r" H
- t( k G$ }8 o2 S
) p0 A* R! V4 i2 J9 ?4 f: s
9 Q9 S% ?) i; B& r1 X- R G, I9 s
O- Z. ?3 A$ V( N: L
准备工具:, y# N+ q" O" R: a# T
- Arduino IDE(如果没有,可以使用文本编辑工具代替。比如Notepad++或者记事本)。
- S4A串口通讯协议。在附件中提供下载。
- S4A Arduino通讯源代码。在附件中提供下载。: v8 N5 ^0 A7 B9 c% m( K
- e" H) j& ]" G& Q+ Y! R; a& {! l
Arduino的函数" r. e, H: X- o
^5 g9 U* y) v( _ Y% P: u+ ~
Arduino控制IO引脚的几个函数在arduino.h(SAM系列的在wiring_digital.h)中。
S4A的数据结构
S4A规定:0 ]' F1 ?% e6 A
- 如果一个引脚是input(用于输入)或者digital(用于输出),那么state取值只能0或者1023 。0表示低电平,1023表示高电平。
- 如果一个引脚是servomotor(舵机接口)或者pwm,state的取值只能从0到255 。表示占空比。0表示占空比为0%,255表示占空比为100% 。5 i3 T* t- E, F* e+ A1 o& T: x! o2 q
) g7 Z5 h/ F3 t) o. ^' CS4A的Arduino源代码中定义了一个14个元素的数组,用来表示D0~D13的引脚的信息和状态:
[原文]/ X; f2 d7 m% W+ B
Components have to be connected in a particular way. S4A allows for 6 analog inputs (analog pins), 2 digital inputs (digital pins 2 and 3), 3 analog outputs (digital pins 5, 6 and 9), 3 digital outputs (pins 10, 11 and 13) and 4 special outputs to connect Parallax continuous rotation servomotors (digital pins 4, 7, 8 and 12).: z" ?" x5 k/ a/ c: g1 U1 ]4 o9 B" D
S4A的通信协议: \. r. R7 P Z5 ~
根据S4A的通信协议(在附件中),每隔一段时间(20ms,在下文中会说明为什么是20ms),Arduino(或者Nucleo)应该依次将A0~A5的模拟量,D2,D3的电平值依次上传。共8组(一组数据由两个字节组成)数据。每一组数据都有相应的格式:4 A6 r4 ^0 c9 P6 c' g q9 A
- 每一个字节的最高位是一个标志位。Byte1的最高位必须为1,Byte2的最高位必须是0.这样就可以判断包是否正确。因为Byte1一定是大于127的,Byte2一定是小于127的。
- N表示数据编号。Arduino上传至S4A:A0~A5模拟量的编号是0~5,D2编号是6,D3编号为7.
- N表示数据编号。S4A下传至Arduino:D4~D13的编号为4~13 。
- R表示需要上传的数据。由10位组成,可以表示0-1023的最大值。这也就是为什么STM32可以达到12位AD采集,却要设置成10位的原因了。2 S! N" d' p: V! r
( ^* H9 ]$ Q$ P6 P& s0 {举个例子:比如某一上传时刻,采集到了A0~A5的电压制为1023,D2为高电平,D3位低电平,那么应该上传:1 L3 S4 D: F$ P! S7 f: ^( {
B1_0000_111 B0_1111111 //A0,1023
B1_0001_111 B0_1111111 //A1,1023' S. v7 T. _# h
B1_0010_111 B0_1111111 //A2,1023
B1_0011_111 B0_1111111 //A3,1023' h8 `% }0 O6 v, z0 M. T
B1_0100_111 B0_1111111 //A4,10232 Z4 }/ U* C& W* J8 e1 S
B1_0101_111 B0_1111111 //A5,1023* p% f7 H; `( O% X) M& `# y
B1_0110_111 B0_1111111 //D2,HIGH
B1_0111_000 B0_0000000 //D3,LOW
5 Y- g* x/ j x: L9 }
Arduino采集AD接口的信息的时候,一个AD接口采集了5次,取五次结果的中间值作为最后上传的结果:6 v( S3 x) I& X+ _; O
& d: e) u: n& i6 G5 i
在源代码中,将数据打包上传的代码:(Serial.write发送8位无符号整数)% T/ O7 x! z& P9 q. V b6 {2 M
[原文]Protocol
S4A interacts with Arduino by sending the actuator states and receiving sensor states every 75 ms, therefore the pulse width needs to be greater than this time period. The data exchange follows the PicoBoard protocol and needs a specific program (firmware) to be installed in the board. Please refer to the Downloads section for further instructions on how to do so.$ p8 v- W8 N# \( [7 s
* X4 n" h9 h* s! _- }" Y) j& E' R
当Arduino接收到S4A传来的数据之后,会对数据解码,获取N编号和R的值:$ D( A, j9 e$ g4 `0 \1 |
20ms?+ R. Q* W8 j2 e N9 G" @
loop函数是整个调用过程:+ p9 @" E J; B2 l# M) |$ `
先科普一下舵机的知识:舵机的转动角度是0~180度,转动角度的大小是由pwm的占空比决定的。pwm的周期必须为20ms。pwm波形中高电平的时间大约在500us~2500us之间。500us代表0度,2500us代表180度。; T* W/ N" P1 ]8 s
9 G6 u+ R5 n) \
" _5 U' o& f8 S4 v3 ^6 t
S4A的Arduino函数解析就这么多,希望大家都能够移植到自己的单片机中。
Have Fun!
s4a-protocol.pdf
2015-6-10 11:08 上传
点击文件名下载附件
74.33 KB, 下载次数: 143
S4A软件串å£åè®®
S4AFirmware16.rar
2015-6-10 14:11 上传
点击文件名下载附件
2.61 KB, 下载次数: 114
S4A Arduinoæºä»£ç
评分
查看全部评分
看到了通讯协议。之后的就很简单了。
不过视频录的不怎么样
都是从小白开始的。现在会的也不多。。。只是觉得好玩