一起玩转树莓派(8)——树莓派模数/数模转换实践(四)

简介: 一起玩转树莓派(8)——树莓派模数/数模转换实践

2.编写代码


对于本实验来说,有涉及到UI开发,我们依然采用Python自带的Tkinter库,其有很好的移植性,并且其提供了Canvas画布,我们可以灵活的渲染所需要的图形。示例代码如下:


#coding:utf-8


# 导入UI模块

import tkinter as Tkinter


#SMBus (System Management Bus,系统管理总线)

import smbus   #在程序中导入“smbus”模块

import RPi.GPIO as GPIO # 导入树莓派GPIO模块

import time # 导入定时器模块

import threading



# 主页面设置

top = Tkinter.Tk()

top.geometry('500x300')

top.title("操纵杆控制圆球")


# 当前圆球的坐标

currentX = 0

currentY = 0

# 当前圆球的颜色是否红色

currentColor = True


# 进行窗口的初始化

canvas = Tkinter.Canvas(top, width=500, height=300, borderwidth=0, highlightthickness=0)

canvas.grid()


# 进化画布的初始化

circle = canvas.create_oval(currentX, currentY, 100, 100, fill="red", outline="")


# 定义移动圆球的方法

def moveCircle(c, x, y):

   global currentX, currentY

   moveX = x

   moveY = y

   if x >= 0:

       if x + currentX > 400:

           moveX = 400 - currentX

           currentX = 400

       else:

           currentX += x

   else:

       if x + currentX < 0:

           moveX = -currentX

           currentX = 0

       else:

           currentX += x

   if y >= 0:

       if y + currentY > 200:

           moveY = 200 - currentY

           currentY = 200

       else:

           currentY += y

   else:

       if y + currentY < 0:

           moveY = -currentY

           currentY = 0

       else:

           currentY += y

   canvas.move(c, moveX, moveY)


# 定义改变圆球颜色的方法

def changeColor(c):

   global currentColor

   canvas.itemconfig(c, fill= 'red' if currentColor else 'blue')

   currentColor = not currentColor



bus = smbus.SMBus(1)         #创建一个smbus实例


# 通过PCF8591读取模拟信号


# 摇杆X引脚的模拟数据

def readX():

   #发送一个控制字节到设备 表示要读取AIN0通道的数据

   bus.write_byte(0x48,0x40)  

   bus.read_byte(0x48)         # 空读一次,消费掉无效数据

   return bus.read_byte(0x48)  # 返回某通道输入的模拟值A/D转换后的数字值


# 摇杆Y引脚的模拟数据

def readY():

#发送一个控制字节到设备 表示要读取AIN1通道的数据

   bus.write_byte(0x48,0x41)  

   bus.read_byte(0x48)         # 空读一次,消费掉无效数据

   return bus.read_byte(0x48)  # 返回某通道输入的模拟值A/D转换后的数字值


# 通过GPIO读取数字信号


# 设置使用的引脚编码模式

GPIO.setmode(GPIO.BOARD)

# 按键使用引脚 BCM 17

BTN = 11

# 引脚初始化 设置下拉高电平

GPIO.setup(BTN, GPIO.IN, pull_up_down=GPIO.PUD_UP)


# 创建定时器函数,用来检查摇杆动作

def fun_timer():

   global timer

   x = readX()

   y = readY()

   press = GPIO.input(BTN)

   print('X:', x)

   print('Y:', y)

   print('按钮:', press)


   if x <= 10:

       moveCircle(circle, -10, 0)

   if x >= 245:

       moveCircle(circle, 10, 0)

   if y <= 10:

       moveCircle(circle, 0, -10)

   if y >= 245:

       moveCircle(circle, 0, 10)


   timer = threading.Timer(0.2, fun_timer)

   timer.start()


timer = threading.Timer(0.2, fun_timer)

timer.start()


# 定义GPIO输入端口的回调

def btnCallback(channel):

   if not GPIO.input(channel):

       changeColor(circle)


# 添加输入引脚电平变化的回调函数

GPIO.add_event_detect(BTN, GPIO.FALLING, callback=btnCallback, bouncetime=200)


top.mainloop()

上面的代码有些长,但是有详尽的注释,关于UI开发方面的内容不是我们本系列博客的重点,这里我们不做过多介绍。moveCircle函数是核心的圆球移动函数,内部通过边界判定逻辑可以确保圆球不会移动到视图界面外。changeColor方法用来修改圆球的颜色,这里我们让每次按键后在红绿颜色间进行切换。readX和readY函数我们无需做过多介绍了,其通过PCF8591的AIN0和AIN1来传输摇杆的横纵坐标信号。GPIO的相关操作我们也非常熟悉了,我们通过注册回调函数来监听操作杆按钮按下的行为。


在树莓派上运行上面的代码,尝试操作下,感受下使用操纵杆控制页面元素的喜悦吧。


3.一点扩展


观察上面的示例代码,你会发现,我们使用了一些临界值来作为触发方向动作的阈值,例如10,245这种,这是因为PCF8591是8位的数模转换模块,即其转换出的数字量在0-255之间(包括0和255),对于本实验来说,我们并没有让摇杆元件传输的模拟量发挥正真的作用,想一下,你是否能够根据操作杆的旋转程度来调整圆球移动的速度呢?动手试试吧!

目录
相关文章
|
安全 算法 C++
【C++ 异常 】深入了解C++ 异常机制中的 terminate()处理 避免不必要的错误(三)
【C++ 异常 】深入了解C++ 异常机制中的 terminate()处理 避免不必要的错误
310 0
|
IDE 网络安全 开发工具
GitLab - GitLab 使用 SSH 免密登录
GitLab 使用 SSH 免密登录
1693 0
GitLab - GitLab 使用 SSH 免密登录
|
12月前
|
传感器
Modbus协议深入解析
Modbus协议是由Modicon公司(现施耐德电气)于1979年发明的串行通信协议,主要用于工业自动化系统中的PLC通信。本文深入解析了Modbus协议的主从模式、数据类型(线圈、离散输入、保持寄存器、输入寄存器)、帧结构和通信过程,并介绍了其应用场景和重要性。
|
传感器 安全 Java
如何使用 CoAP 协议进行设备通信
CoAP(Constrained Application Protocol)是一种适用于资源受限设备的轻量级协议,常用于物联网(IoT)设备之间的通信。本文介绍如何使用 CoAP 协议进行设备通信,包括协议的基本概念、消息格式、请求与响应流程以及实际应用示例。
1689 3
|
Ubuntu Linux 数据安全/隐私保护
使用Cython库包对python的py文件(源码)进行加密,把python的.py文件生成.so文件并调用
本文介绍了在Linux系统(Ubuntu 18.04)下将Python源代码(`.py文件`)加密为`.so文件`的方法。首先安装必要的工具如`python3-dev`、`gcc`和`Cython`。然后通过`setup.py`脚本使用Cython将`.py文件`转化为`.so文件`,从而实现源代码的加密保护。文中详细描述了从编写源代码到生成及调用`.so文件`的具体步骤。此方法相较于转化为`.pyc文件`提供了更高的安全性。
1511 2
|
网络协议 安全 网络安全
深入解析TURN协议的作用与重要性
【8月更文挑战第24天】
515 0
|
Linux 开发工具 Windows
kali修改apt安装的源为国内源,提升访问速度,以及apt update ,apt upgrade和apt dist-upgrade的区别
kali修改apt安装的源为国内源,提升访问速度,以及apt update ,apt upgrade和apt dist-upgrade的区别
|
网络协议 Linux 编译器
【原创】EtherCAT主站IgH解析(二)-- 如何将Igh移植到Linux/Windows/RTOS等多操作系统移植指南
EtherCAT主站方案对比:商业的如Acontis、TwinCAT3和开源的igh、SOEM。SOEM易移植但功能和实时性不足,适合简单应用;igh功能强大,实时性能优秀,基于内核态,适合复杂场景。igh能移植到其他RTOS,但需克服多任务无调度的挑战。依赖操作系统服务如定时器、内存分配,适合Linux内核,但移植到裸机复杂。
1045 0
|
存储 安全 NoSQL
【C++ 异常 】深入了解C++ 异常机制中的 terminate()处理 避免不必要的错误(二)
【C++ 异常 】深入了解C++ 异常机制中的 terminate()处理 避免不必要的错误
1011 1