亚博官网Sparkfun教程 urn:uuid:5902bec3-4187-acaf-e181-2f685478e85a 带Arduino和XBees的无线遥控机器人 博博霍 https://www.亚博官网sparkfun.com/users/9605 urn:uuid:f0a2d5cb-0523-304a-c715-7622f31b573d 2019年3月12日00:00:00-06:00

带Arduino和XBees的无线遥控机器人亚博在线娱乐官网learn.亚博官网sparkfun.com教程

可在线访问:http://sfe.io/t868

介绍

在本教程中,我们将扩展Redbot的sik,用xbee无线电无线控制机器人!我们将探索一种不同的微控制器,并远程无线控制Redbot。当心,我们需要把无线控制器焊接在一起。

同时控制3个机器人的无线操纵杆

所需材料

要遵循本教程,你需要以下材料。但你可能并不需要一切,这取决于你拥有什么。把它加入你的购物车,通读指南,并根据需要调整推车。

工具

你需要一个烙铁,焊料,和一般焊接附件.如果你以前没有焊接过,我们建议看看工具包.您还需要一个剥线钳和一些导线,具体取决于您使用的XBEE。

烙铁-60W(可调温度)

烙铁-60W(可调温度)

TL-14566
12.95美元
无铅焊锡-15克管

无铅焊锡-15克管

TL—09163
3.50美元
剥线钳-20-30AWG

剥线钳-20-30AWG

TL-14763
14.95美元
连接线-白色(22 AWG)

连接线-白色(22 AWG)

PRT-08026
2.50美元

建议阅读

如果您不熟悉以下概念,我们建议在继续之前先查看这些教程。

如何焊接:通孔焊接

本教程涵盖了关于通孔焊接的所有知识。

使用电线

如何剥离,卷曲,和电线一起工作。

带阴影底盘的Redbot装配指南

Redbot工具包的装配指南。本教程包括要与Redbot Inventor的工具包教程一起使用的额外零件。

探索XBees和XCTU

如何使用计算机设置XBEE,X-CTU软件,以及XBEE Explorer接口板。

带阴影底盘的Redbot试验指南

本实验指南提供九个实验,让您开始使用Sparkfun Redbot。亚博官网本指南是为那些熟悉我们的SparkFun发明家工具包并希望将他们的机器人技术知识提升到下一个层次的人而设计的。亚博官网

无线操纵杆连接指南

Sparkfun无线操纵杆套件的连接指南。亚博官网

硬件连接

组装式阴影底盘

我们假设你有一个带阴影底盘的装配机器人.

带阴影底盘的Redbot装配指南

5月28日,二千零一十五

Redbot工具包的装配指南。本教程包括要与Redbot Inventor的工具包教程一起使用的额外零件。

电机和电源开关

确保将电机和电源开关分别拨到运行和接通位置。

打开电源

电机线

为了与组装和实验指南中使用的连接一致,确保电机线匹配下面的表格和图片。

左马达:

Redbot主板插脚 左电机跨接导线
左电机-红色 焊接在电机跨接导线上-红色
左电机-黑色 焊接在电机跨接导线上-黑色

右马达:

Redbot主板插脚 右电机跨接导线
右电机-红色 焊接在电机跨接导线上-黑色
右电机-黑色 焊接在电机跨接导线上-红色


插入USB电缆

软件串行开关

为了避免在RedBot上构建XBee或上传,建议使用软件串行端口。确保将开关拨到“XBE SW系列“一边。

软件串行开关

装配式无线操纵杆

我们还假设您将无线操纵杆组装在一起。退房无线操纵手柄连接指南中的硬件连接部分更多信息。请注意,与无焊Redbot套件不同,您需要将组件焊接在一起。

无线操纵杆连接指南

1月5日,二千零一十七

Sparkfun无线操纵杆套件的连接指南。亚博官网

本教程中使用的示例代码适用于双操纵杆和单操纵杆。

双操纵杆 单操纵杆
双操纵杆 单操纵杆

XBEE 3的跨接导线

以下代码适用于设置为透明模式的XBEE系列1。如果您使用的是XBEE系列3,您可能需要在XBEE系列3的重置引脚和无线操纵杆的A5之间添加跳线。简单地剪断并剥开一根电线在XBee的阴插座上的重置针和A5之间添加。

突出显示无线操纵杆重置销

XBEE系列3的焊接销

一旦焊接好导线,它应该与下面的图像类似。

在A5和XBEE插座上的重置引脚之间跨接导线

XBEE系列3上A5和重置引脚之间的跨接导线


配置XBees

要配置XBees,我们将使用XBEE Series 1固件。建议使用XBeeExplorer USB配置每个XBee。

xbee插入的int xbee explorer USB配置

如果你还没有,退房从XCTU开始在探索XBees和XCTU下的部分配置您的XBees。

探索XBees和XCTU

3月12日,二千零一十五

如何使用计算机设置XBEE,X-CTU软件,以及XBEE Explorer接口板。

点对点配置

为简单起见,我们将以点对点配置的透明模式发送XBEE命令。如果您的ch和pan id中有两个以上的xbee,请确保为每个xbee配置一个唯一的my地址。然后,您需要调整每个XBEE的DL地址。

设置 首字母缩略词 传输XBEE节点1
(无线操纵杆)
接收XBee节点2
(机器人)
通道 中国 C C
泛ID 身份证件 三千三百三十三 三千三百三十三
目标地址高 DH
目标地址低 动态链接库
16位源地址 我的

设置Arduino

注:此示例假定您正在桌面上使用最新版本的Arduino IDE。如果这是你第一次使用Arduino,请回顾我们的教程 安装Arduino IDE。

无线控制器

SAMD21驱动程序

无线操纵杆内置CDC。取决于您的操作系统,您可能需要安装驱动程序。请确保按照中的说明查看有关驱动程序的部分。SAMD21 mini/dev分接头连接指南.

在Windows上安装驱动程序
为Windows OS安装驱动程序

板SAMD21附加组件

有几个板附加组件要安装。如果你还没有,确保按照中的说明安装Arduino SAMD板和Sparkfun板定义。亚博官网SAMD21 mini/dev分接头连接指南.这些是用于无线操纵杆的相同附加组件。

安装Arduino SAMD板
为SAMD21设置Arduino

Redbot主板

FTDI驱动程序

记得,要从浏览器对机器人进行编程,您首先需要安装一些FTDI驱动程序。按照中的步骤操作如何安装ftdi驱动程序这样做。这在Redbot指南中也有解释。

如何安装ftdi驱动程序

6月4日,二千零一十三

如何在Windows上安装FTDI基本版的驱动程序,Mac OS X,和Linux。

阿杜诺图书馆

注:如果您以前没有安装过Arduino库,请查看我们的 安装指南。

确保按照中的说明安装Redbot库。Redbot库快速参考.您还可以找到Redbot库的快速概述,类,方法,和变量。


实验1:发送和接收信号

介绍

有几种方法可以在两个Arduinos和一对XBee之间传输数据。可以在透明模式下发送串行字符,数据包处于API模式,或使用I/O引脚控制。为简单起见,我们将以透明模式发送字符。

需要零件

您需要从所需材料中获得以下零件:

  • 2x XBees(配置为1系列固件)
  • 1根Cerberus电缆(或1根Micro-B USB和1根Mini-B USB电缆)
  • 带Redbot主板的1X组装式阴影机箱
  • 4X AA电池
  • 1个组合式无线操纵杆
  • 1X锂电池

1.1:发送

在这部分实验中,我们将把一个字符从控制器发送到同一个通道上的Redbot。

硬件连接

如果你还没有,将XBEE和电池插入控制器。然后通过USB电缆将控制器连接到计算机。

Micro-B USB电缆插入无线操纵杆

打开素描

将以下代码复制并粘贴到Arduino IDE中。选择SAMD21 DEV突破作为董事会,选择它枚举的COM端口,将无线操纵杆开关拨到打开位置,然后点击上传。

语言:c/*1_1_xbee_transmit_basic_samd21.ino xbee transmit basic samd21示例作者:Ho Yun Bobby Chan日期:2/15/19 Sparkfun Electronics许可证:Creative Common亚博官网s属性shareLiked 4.0(CC by-SA 4.0)使用此代码执行任何您想要的操作,可用于任何用途。请将此许可证归为属性并保留。这是SAMD21无线操纵杆的示例代码。通过串行监视器输入的任何字符都将发送到硬件UART引脚。假设您在同一个通道上有一对XBees Series 1模块(或配置了802.15.4协议的Series 3模块),一个字符将在XBees之间无线传输。然后,接收XBEE将把字符传递给ATMega328P微控制器,以最终控制机器人。注意:对于某些XBEE系列3模块,您可能需要将A5连接到无线操纵杆上的XBEE系列3的重置触针。有关详细信息,签出xbee3_reset()函数。*/char c_data;//通过串行监视器发送值进行调试//led检查LED是否已初始化。const int status_led=13;//对于某些xbee系列3模块define xbee_reset a5void setup()serialusb.begin(9600);//初始化串行监视器进行调试//如果要取消对此项的注释等待串行监视器打开。[同时]!SerialUSB);//等待串行监视器打开serialusb.println(“无线操纵手柄控制器初始化”);序列1.开始(9600);//以9600波特的xbee3_reset()与xbee开始串行通信;//如果xbee3初始化有问题,硬件重置//状态指示灯,查看控制器是否正在初始化PINMODE(状态指示灯,输出;对于(int i=0);I<3;i++)数字写入(状态指示灯,高);//设置状态LED开启延迟(50);数字写入(状态指示灯,低);//设置状态LED关闭延迟(50);}serialusb.println(“无线操纵杆控制器的XBEE准备好通信”);delay(10);//end setupvoid loop()//send commands via serial monitor for testing here if(serialusb.available())c_data=serialusb.read();//从串行监视器中提取字符并存储在变量serial1.print(c_data);//发送到xbee//echo返回发送到串行监视器serialusb.println(“sending character here,“”;serialusb.println(c_数据);数字写入(状态指示灯,高);//开启状态LED延时(100);//增加LED短延时反馈,如果这会影响数字写入的性能(状态指示灯,低);//关闭状态LED//结束loopvoid xbee3_reset()//硬件重置/*-xbee系列3硬件参考手册-PG 31电源设计建议VCC和GND之间的去耦电容器。使用10uF电容器测试,不使用。这是不必要的。-第60页:褐色检测。这是必需的。在XBEE的重置和A5之间添加跳线https://www.digi.com/resources/documentation/digidocs/pdf s/90001543.pdf-通过接地重置插脚来实现XBEE系列3的电源循环,以避免斜坡上升和变暗检测中的连续性https://www.silabs.com/community/mcu/32-bit/knowledge-base.entry.html/2017/06/14/rmu-e203_Avdd_Ramp-j176-min强制复位时间:EFM32设备=50ns;EFM32PG/JG:Pearl and Jade Gecko=100ns https://www.silabs.com/community/mcu/32-bit/knowledge-base.entry.html/2016/07/22/minimum_reset_holdt-pgld*/pinmode(xbee_reset,输出;数字写入(xbee_重置,高);延迟微秒(1);数字写入(xbee_重置,低);延迟微秒(1);数字写入(xbee_重置,高);/*//软件重置//软件重置不适用于XBEE系列3…需要硬件重置延迟(500);//等待XBEE系列3在硬件重置系列1之后启动。写入(“++“”;//输入命令模式延迟(500);//当XBEE进入命令模式serial1.write(“atfr”);//at命令软件重置serial1.write(“\r”);//carrial返回serial1.write(“\n”);//new line*/

需要注意的代码

代码设置一个变量来跟踪正在发送的字符,当我们发送一个字符时,一个用于指示针13上的LED,以及一个重置XBEE的密码。由于控制器使用SAMD21,我们将使用初始化串行监视器进行调试串行USB和硬件串行使用串行1使用xbee发送字符9600波特.在我们的自定义函数中,当主板通电时,代码将短暂地切换A5以重置XBEE3。XBE33REST().初始化完成后,LED将闪烁三次。然后我们将监听串行监视器中IF-()语句。如果通过串行终端发送字符,我们将把这个字符传给XBEE,并将其回送到串行监视器进行调试。


1.2:接收

在这部分实验中,我们将让Redbot从第一个控制器接收一个字符。

硬件连接

如果你还没有,将XBEE插入Redbot。然后通过USB电缆将Redbot连接到计算机。

Mini-B USB电缆插入Redbot

打开素描

将以下代码复制并粘贴到Arduino IDE中。因为我们正在上传Redbot主板的代码,我们需要选择Arduino/Genuino乌诺对于Redbot主板,选择它枚举的对应COM端口,将电源开关拨到接通位置。一旦调整了这些设置,你可以点击上传按钮。

语言:c/*1_2_xbee_receive_basic_atmega328p.ino xbee receive basic atmega328p示例作者:Ho Yun Bobby Chan日期:2/15/19 Sparkfun Electronics许可证:Creative Commo亚博官网ns属性shareLiked 4.0(CC by-SA 4.0)使用此代码执行您喜欢的操作,可用于任何用途。请将此许可证归为属性并保留。远程控制Redbot的第一步是在系链设置中首先将其从串行监视器中驱动出来。这是带有ATMEGA328P的Redbot主板的示例代码。上传这个草图之后,使用USB电缆将Redbot与计算机保持连接。将开关翻到各自的侧面:电机=>运行和电源=>打开。您还需要将UART翻转到Xbee_sw_串行端。假设您在同一个通道上有一对XBee1s(或配置了802.15.4协议的3),一个字符将在XBees之间无线传输。从连接到软件串行定义的插脚的XBEE接收到的任何字符都将传递到串行监视器。对于故障排除,通过串行监视器发送的任何字符都将被回显。*/包括
       
        //包括Redbot库char c_数据;//保存从Xbee到Arduino的输入数据的变量//我们将使用Redbot SoftwareSerial与Xbee进行通信:/(对于ATMega328P的//Xbee的DOUT(TX)连接到插脚14(Arduino的软件Rx)//Xbee的DIN(Rx)连接到插脚15(Arduino的软件Tx)包括
        
         RedBot软件系列RedBotXBee;//创建软件串行实例,修改后的软件串行库中已经定义了管脚//led,用于检查LED是否已初始化。const int status_led=13;void set up()//将两个端口都设置为9600波特。这个值对于xbee来说是最重要的。确保波特率与xbee的配置//设置匹配。redbot xbee.begin(9600);//初始化sw for xbee以接收串行串行。begin(9600);//初始化hw以调试串行监视器//状态LED以查看redbot是否正在初始化pinmode(状态LED,输出;对于(int i=0);I<3;i++)数字写入(状态指示灯,高);//设置状态LED开启延迟(50);数字写入(状态指示灯,低);//设置状态LED关闭延迟(50);}serial.println(“Redbot初始化!”);//end setupvoid loop()if(redbotxbee.available()serial.available())if(redbotxbee.available())c_data=redbotxbee.read();//将接收到的值从xbee存储到变量else if(serial.available())c_data=serial.read();//将接收到的值从串行监视器存储到变量serial.println(“字符收到,“”;serial.write(c_data);//发送到serial monitor serial.println();数字写入(状态指示灯,高);//打开状态LED延迟微秒(500);//为LED添加短延迟以进行反馈,如果影响性能DigitalWrite(状态指示灯,低);//关闭状态LED//结束循环
        
       

需要注意的代码

Redbot的代码类似于SAMD21。然而,既然我们使用的是atmega328,我们将设置软件序列号以接收来自XBEE的字符。Redbot使用自定义软件序列,因此我们需要将 .我们将使用初始化串行监视器进行调试系列和软件串行使用雷德波克斯比接收XBEE中的字符9600波特.在Redbot主板上使用Xbee3时,XBEE3在初始通电期间没有任何问题,因此无需切换XBEE3的重置PIN。初始化完成后,LED将再次闪烁三次。然后,我们将监听串行监视器或软件串行中接收到的任何字符。IF-()语句。如果接收到字符,我们将在串行监视器中显示该字符以进行调试。


你应该看到什么

我们将为每个板打开一个串行终端,看看是否有一个字符从控制器发送到Redbot。对于控制器,我们将打开串行终端九千六百控制器在上枚举的。为了RedBot,我们将使用Arduino串行监视器九千六百因为我们刚把代码上传到板上。在串行终端中发送任何字符都会回音,并且HAS控制器的XBEE会无线地将一个字符发送到Redbot的XBEE。一旦收到,字符将显示在Arduino串行监视器中。

两个终端上的串行输出

无法看到输出?单击图像放大。

祝贺你,您已经成功地在两个Arduinos之间无线发送了一个字符!


实验二:无线驾驶

介绍

既然我们已经成功地发送了一个字符,下一步是让控制器在发送字符之前接收输入。一旦接收机器人接收到角色,我们会让马达前进。

需要零件

您需要从所需材料中获得以下零件:

  • 2x XBees(配置为1系列固件)
  • 1根Cerberus电缆(或1根Micro-B USB和1根Mini-B USB电缆)
  • 带Redbot主板的1X组装式阴影机箱
  • 4X AA电池
  • 1个组合式无线操纵杆
  • 1X锂电池

2.1:带SAMD21的遥控器

在这部分实验中,我们将根据输入从控制器发送一个字符。为简单起见,当按下按钮(D2)且左操纵杆处于向上位置时,我们将发送一个字符。

硬件连接

如果你还没有,通过USB电缆将控制器连接到计算机。

Micro-B USB电缆插入无线操纵杆

打开素描

将以下代码复制并粘贴到Arduino IDE中。记住选择SAMD21 DEV突破对于控制器,选择它枚举的COM端口,将无线操纵杆开关拨到打开位置,然后点击上传。

语言:c/*2_1_remote_control_samd21.ino remote control samd21示例作者:Ho Yun Bobby Chan日期:2/15/19 Sparkfun Electronics许可证:Creative Co亚博官网mmons属性shareliked 4.0(CC by-SA 4.0)使用此代码执行任何您想执行的操作,可用于任何用途。请将此许可证归为属性并保留。这是SAMD21无线操纵杆的示例代码。通过串行监视器输入的任何字符或满足条件语句时,都将发送到硬件UART管脚。假设您在同一个通道上有一对XBees Series 1模块(或配置了802.15.4协议的Series 3模块),一个字符将在XBees之间无线传输。然后,接收XBee将把字符传递给ATMega328P微控制器,使机器人向前移动。按下D2(如果您在右侧焊接了操纵杆或按钮),将检查左侧的操纵杆。当移动操纵杆时会传输一个字符:向上=向前,需要对Redbot进行编程以读取这些值。注意:对于某些XBEE系列3模块,您可能需要将A5连接到无线操纵杆上的XBEE系列3的重置触针。有关详细信息,查看xbee3_reset()函数。*/define forward_reverse_joystick a3//用于左操纵杆Y组件的销define turn_joystick a2//用于左操纵杆X组件的销按钮Accelerate_state;//存储按钮状态的值按define accelerate_button 2//右触发器使用的pin//我们将在此处存储模拟操纵杆值Int16_t forward_reverse_stick_value;Int16_t turnstick_value;char c_data;//通过串行监视器发送值进行调试//LED检查LED是否初始化。const int status_led=13;//n为某些Xbee系列3模块输入eed define Xbee_reset a5void setup()serialusb.begin(9600);//初始化串行监视器进行调试//如果要等待串行监视器打开,请取消对此的注释。[同时]!SerialUSB);//等待串行监视器打开serialusb.println(“无线操纵手柄控制器初始化”);序列1.开始(9600);//以9600波特的xbee3_reset()与xbee开始串行通信;//如果xbee3初始化有问题,硬件重置PINMODE(加速按钮,输入插拔);//启用加速按钮d2的上拉电阻//状态LED,查看Redbot是否正在初始化PinMode(状态LED,输出;对于(int i=0);I<3;i++)数字写入(状态指示灯,高);//设置状态LED开启延迟(50);数字写入(状态指示灯,低);//设置状态LED关闭延迟(50);}serialusb.println(“无线操纵杆控制器的XBEE准备好通信”);delay(10);//end setupvoid loop()//初始化变量以读取按钮按钮Accelerate_state=DigitalRead(Accelerate_button);/***按钮1状态-低或0表示按下-高或1表示未按下****///存储值读取操纵杆前进\后退\斗杆\值=模拟读取(前进\后退\操纵杆);旋转杆_值=模拟读数(旋转操纵杆);//send commands via serial monitor for testing here if(serialusb.available())c_data=serialusb.read();//take character from serial monitor and store in variable serial1.print(c_data);//send to xbee//echo back what was sent to serialusb.println(“sending character here,“”;serialusb.println(c_数据);数字写入(状态指示灯,高);//打开状态LED if(buttonAccelerate_state==low)serialusb.println(“Accelerate button has been pressed!”);if(正向_反向_Stick_Value>1000)serialusb.println(“正向”);serial1.print('a');//通过同一频道上的XBEE向Redbot传输数字写入(状态_LED,高);//打开状态LED//在此处调试左侧模拟操纵杆//边界根据操纵杆的读取值而变化//您可能需要调整要校准的条件语句中的值//需要编写附加条件语句以进行旋转//和反转序列B.print(“Forward_Reverse_Stick_vaLUE=“”;//~ 1023,~7-9下serialusb.println(正向\反向\棒值);serialusb.println(“turnstick_value=”);//左1023,~5-6右serialusb.println(转盘_值);延迟(100);//增加LED反馈的短延时,如果这会影响数字写入的性能(状态指示灯,低);//关闭状态LED//结束loopvoid xbee3_reset()//硬件重置/*-xbee系列3硬件参考手册-PG 31电源设计建议VCC和GND之间的去耦电容器。使用10uF电容器测试,不使用。这是不必要的。-第60页:褐色检测。这是必需的。在XBEE的重置和A5之间添加跳线https://www.digi.com/resources/documentation/digidocs/pdf s/90001543.pdf-通过接地重置插脚来实现XBEE系列3的电源循环,以避免斜坡上升和变暗检测中的连续性https://www.silabs.com/community/mcu/32-bit/knowledge-base.entry.html/2017/06/14/rmu-e203_Avdd_Ramp-j176-min强制复位时间:EFM32设备=50ns;EFM32PG/JG:Pearl and Jade Gecko=100ns https://www.silabs.com/community/mcu/32-bit/knowledge-base.entry.html/2016/07/22/minimum_reset_holdt-pgld*/pinmode(xbee_reset,输出;数字写入(xbee_重置,高);延迟微秒(1);数字写入(xbee_重置,低);延迟微秒(1);数字写入(xbee_重置,高);/*//软件重置//软件重置不适用于XBEE系列3…需要硬件重置延迟(500);//等待XBEE系列3在硬件重置系列1之后启动。写入(“++“”;//输入命令模式延迟(500);//当XBEE进入命令模式serial1.write(“atfr”);//at命令软件重置serial1.write(“\r”);//carrial返回serial1.write(“\n”);//new line*/

需要注意的代码

在1.1中添加代码,我们将设置操纵杆的销。自从操纵杆有两个电位计为了确定它的位置,我们将设置模拟读取引脚,并有一个变量来存储读数。我们还将为连接到d2的按钮设置pin,并创建一个变量来确定按钮状态。

初始化操纵杆后,我们将读取按钮状态和模拟管脚,然后将值存储在各自的变量中。我们将保留从串行监视器接收串行字符的代码部分,以便进行调试。最后,我们将检查按钮d2是否被按下,并在操纵杆处于向上位置时发送一个字符。如果我们连接到计算机,我们将回送字符进行调试。

2.2带ATMEGA328P的机器人接收

在这部分实验中,我们将从控制器接收一个字符,并让Redbot向前驱动。

硬件连接

如果你还没有,通过USB电缆将Redbot连接到计算机。

Mini-B USB电缆插入Redbot

打开素描

将以下代码复制并粘贴到Arduino IDE中。记得,我们需要选择Arduino/Genuino乌诺对于Redbot主板,选择它枚举的对应COM端口,将电源开关拨到接通位置。一旦调整了这些设置,你可以点击上传按钮。

语言:c/*2_2_robot_receive_atmega328p.ino robot receive atmega328p示例作者:Ho Yun Bobby Chan日期:2/15/19 Sparkfun Electronics许可证:Creative Co亚博官网mmons属性shareLiked 4.0(CC by-SA 4.0)使用此代码执行您喜欢的任何操作,可用于任何用途。请将此许可证归为属性并保留。远程控制Redbot的第一步是在系链设置中首先将其从串行监视器中驱动出来。这是带有ATMEGA328P的Redbot主板的示例代码。上传这个草图之后,使用USB电缆将Redbot与计算机保持连接。将开关翻到各自的侧面:电机=>运行和电源=>打开。您还需要将UART翻转到Xbee_sw_串行端。假设您在同一个通道上有一对XBee1s(或配置了802.15.4协议的3),一个字符将在XBees之间无线传输。从连接到软件串行定义的插脚的XBEE接收到的任何字符都将传递到串行监视器。对于故障排除,通过串行监视器发送的任何字符都将被回送。尝试测试控制器,看看机器人是否会向前移动或通过串行监视器发送以下字符。A=前进如果发送前进命令时您的电机没有前进,只需翻转接线即可。您可以调整代码,但这需要调整多行代码。这并不像无线操纵杆例子和Redbot实验9中使用的例子那样,解释了马达的强度。警告:上传到Redbot主板时,请确保将开关切换到xbee-sw-u串行。您在上传代码时会遇到问题,可能会损坏您的xbee.*/包括
       
        //包括Redbot库RedbotMotors电机;//生成redbotchar c_数据的实例;//保存从Xbee到Arduino的输入数据的变量//我们将使用Redbot SoftwareSerial与Xbee进行通信:/(对于ATMega328P的//Xbee的DOUT(TX)连接到插脚14(Arduino的软件Rx)//Xbee的DIN(Rx)连接到插脚15(Arduino的软件Tx)包括
        
         RedBot软件系列RedBotXBee;//创建软件串行实例,修改后的软件串行库中已经定义了管脚//led,用于检查LED是否已初始化。const int status_led=13;void set up()//将两个端口都设置为9600波特。这个值对于xbee来说是最重要的。确保波特率与xbee的配置//设置匹配。redbot xbee.begin(9600);//初始化sw for xbee以接收串行串行。begin(9600);//初始化hw以调试串行监视器//状态LED以查看redbot是否正在初始化pinmode(状态LED,输出;对于(int i=0);I<3;i++)数字写入(状态指示灯,高);//设置状态LED开启延迟(50);数字写入(状态指示灯,低);//设置状态LED关闭延迟(50);}serial.println(“Redbot初始化!”);//end setupvoid loop()if(redbotxbee.available()serial.available())if(redbotxbee.available())c_data=redbotxbee.read();//将接收到的值从xbee存储到变量else if(serial.available())c_data=serial.read();//将接收到的值从串行监视器存储到变量serial.println(“字符收到,“”;serial.write(c_data);//发送到serial monitor serial.println();数字写入(状态指示灯,高);//打开状态指示灯//延迟微秒(500);//添加短延迟指示灯进行反馈,如果它影响性能,则可以将其注释掉,如果(c撊data='a')serial.println(“drive forward”);redbotxbee.write(“a”);数字写入(状态指示灯,高);//打开状态LED电机。驱动(255);//转发其他//未收到任何内容,不做任何事延迟(100);//short pause,这样我们就不会一直收到字符motors.stop();//关闭motors digitalwrite(状态_led,低);//关闭状态LED//结束循环
        
       

需要注意的代码

因为我们使用的是Redbot的马达,包括图书馆之后,我们需要马上安装马达。再一次,我们将保留从串行监视器接收串行字符的代码部分,以便进行调试。请注意,这段代码还接受从XBEE接收到的字符,并将其保存在变量中。

不久之后,我们将检查字符是否匹配从控制器发送的内容。如果字符匹配,我们将全速前进。在关闭电机之前,增加了一个短暂的延迟使机器人向前移动。为了调试,我们将向串行监视器发送一条消息,指示我们接收到一个字符以向前驱动并短暂点亮LED。


你应该看到什么

断开控制器和机器人与计算机的连接。将电池插入电路板。按下连接到D2的按钮并将左操纵手柄移到向上位置将从控制器发送一个字符。接收到的Redbot应该远程前进!

无线控制器命令机器人以演示的形式向前移动


实验3:无线控制机器人

介绍

现在我们可以无线移动我们的机器人了,我们将需要额外的命令来转弯和反向行驶。

需要零件

您需要从所需材料中获得以下零件:

  • 2x XBees(配置为1系列固件)
  • 1根Cerberus电缆(或1根Micro-B USB和1根Mini-B USB电缆)
  • 带Redbot主板的1X组装式阴影机箱
  • 4X AA电池
  • 1个组合式无线操纵杆
  • 1X锂电池

3.1:带SAMD21的全远程控制

在这部分实验中,我们将重复2.1中的步骤,以发送反向转弯或行驶的命令。

硬件连接

通过USB电缆将控制器重新连接到计算机。

Micro-B USB电缆插入无线操纵杆

打开素描

将以下代码复制并粘贴到Arduino IDE中。记住选择SAMD21 DEV突破对于控制器,选择它枚举的COM端口,将无线操纵杆开关拨到打开位置,然后点击上传。

语言:c/*3_1_full_remote_control_samd21.ino full remote control samd21示例作者:Ho Yun Bobby Chan日期:2/15/19 Sparkfun Electronics许可证:Creative Co亚博官网mmons属性shareLiked 4.0(CC by-SA 4.0)使用此代码执行任何您想要的操作,可用于任何用途。请将此许可证归为属性并保留。这是SAMD21无线操纵杆的示例代码。通过串行监视器输入的任何字符或满足条件语句时,都将发送到硬件UART管脚。假设您在同一个通道上有一对XBees Series 1模块(或配置了802.15.4协议的Series 3模块),一个字符将在XBees之间无线传输。然后,接收XBee将把字符传递给ATMega328P微控制器,使机器人向前移动。按下D2(如果您在右侧焊接了操纵杆或按钮),将检查左侧的操纵杆。移动操纵杆时将传输一个字符。向上=右前=右前转向向下=左后=左前转向中间=未按下D2时滑行,将发送一个字符以停止电机。需要对Redbot进行编程以读取这些值。注意:对于某些XBEE系列3模块,您可能需要将A5连接到无线操纵杆上的XBEE系列3的重置触针。有关详细信息,查看xbee3_reset()函数。*/define forward_reverse_joystick a3//用于左操纵杆Y组件的销define turn_joystick a2//用于左操纵杆X组件的销t prev_buttons accelerate_state;//存储按钮按下当前按钮加速状态的值;//值存储按钮的当前状态按define accelerate_button 2//右触发器使用的pin//我们将在此处存储模拟操纵杆值Int16_t forward_reverse_stick_value;Int16_t turnstick_value;char c_data;//通过串行监视器发送值进行调试//led检查led是否初始化。const int status_led=13;//某些Xbee系列3模块需要define Xbee_reset A5void setup()serialusb.begin(9600);//初始化串行监视器进行调试//如果要等待串行监视器打开,请取消对此的注释。[同时]!SerialUSB);//等待串行监视器打开serialusb.println(“无线操纵手柄控制器初始化”);序列1.开始(9600);//以9600波特的xbee3_reset()与xbee开始串行通信;//如果xbee3初始化有问题,硬件重置PINMODE(加速按钮,输入插拔);//启用加速按钮D2的上拉电阻//状态LED,查看控制器是否正在初始化PINMODE(状态LED,输出;对于(int i=0);I<3;i++)数字写入(状态指示灯,高);//设置状态LED开启延迟(50);数字写入(状态指示灯,低);//设置状态LED关闭延迟(50);}serialusb.println(“无线操纵杆控制器的XBEE准备好通信”);delay(10);//end setupvoid loop()//初始化变量以读取按钮current_buttonAccelerate_state=digitalread(Accelerate_button);/***按钮1状态-低或0表示按下-高或1表示未按下****///存储值读取操纵杆前进\后退\斗杆\值=模拟读取(前进\后退\操纵杆);旋转杆_值=模拟读数(旋转操纵杆);//send commands via serial monitor for testing here if(serialusb.available())c_data=serialusb.read();//take character from serial monitor and store in variable serial1.print(c_data);//send to xbee//echo back what was sent to serialusb.println(“sending character here,“”;serialusb.println(c_数据);}if(当前_按钮Accelerate_state==low)serialusb.println(“已按下Accelerate按钮!”);if(正向_反向_Stick_Value>1000)serialusb.println(“正向”);serial1.print('a');//通过同一频道上的XBEE向Redbot传输数字写入(状态_LED,高);//打开状态指示灯//延迟微秒(500);//添加短延迟指示灯进行反馈,如果影响性能,可以将其注释掉;否则,如果(Turnstick_value<20)serialusb.println(“turn right”);serial1.打印(“b”);数字写入(状态指示灯,高);//打开状态指示灯//延迟微秒(500);//添加短延迟指示灯进行反馈,如果影响性能,可以将其注释掉;否则,如果(正向反向斗杆值<20)serialusb.println(“反向”);serial1.打印(“c”);数字写入(状态指示灯,高);//打开状态指示灯//延迟微秒(500);//添加短延迟指示灯进行反馈,如果影响性能,则可以将其注释掉;否则,如果(转向杆_值>1000)serialusb.println(“左转”)。序列1.打印(“d”);数字写入(状态指示灯,高);//打开状态指示灯//延迟微秒(500);//添加短延迟指示灯进行反馈,如果影响性能,则可以将其注释掉。数字写入(状态指示灯,高);//打开状态指示灯serial1.print('j');}//在此处调试左侧模拟操纵杆//边界根据操纵杆的读取值而变化//您可能需要调整要校准的条件语句中的值//需要编写附加条件语句以旋转//并反转serialusb.print(“Forward_Reverse_Stick_Value=”);//~ 1023,~7-9下serialusb.println(正向\反向\棒值);serialusb.println(“turnstick_value=”);//左1023,~5-6右serialusb.println(转盘_值);}else//current_buttonAccelerate_state==high//如果不向驱动器发送命令,自动让机器人停止移动serialusb.println(“停止”);数字写入(状态指示灯,高);//打开状态指示灯serial1.print('k');}上一个按钮加速状态=当前按钮加速状态;//保存当前状态延迟(100);//增加LED反馈的短延时,如果这会影响数字写入的性能(状态指示灯,低);//关闭状态LED//结束loopvoid xbee3_reset()//硬件重置/*-xbee系列3硬件参考手册-PG 31电源设计建议VCC和GND之间的去耦电容器。使用10uF电容器测试,不使用。这是不必要的。-第60页:褐色检测。这是必需的。在XBEE的重置和A5之间添加跳线https://www.digi.com/resources/documentation/digidocs/pdf s/90001543.pdf-通过接地重置插脚来实现XBEE系列3的电源循环,以避免斜坡上升和变暗检测中的连续性https://www.silabs.com/community/mcu/32-bit/knowledge-base.entry.html/2017/06/14/rmu-e203_Avdd_Ramp-j176-min强制复位时间:EFM32设备=50ns;EFM32PG/JG:Pearl and Jade Gecko=100ns https://www.silabs.com/community/mcu/32-bit/knowledge-base.entry.html/2016/07/22/minimum_reset_holdt-pgld*/pinmode(xbee_reset,输出;数字写入(xbee_重置,高);延迟微秒(1);数字写入(xbee_重置,低);延迟微秒(1);数字写入(xbee_重置,高);/*//软件重置//软件重置不适用于XBEE系列3…需要硬件重置延迟(500);//等待XBEE系列3在硬件重置系列1之后启动。写入(“++“”;//输入命令模式延迟(500);//当XBEE进入命令模式serial1.write(“atfr”);//at命令软件重置serial1.write(“\r”);//carrial返回serial1.write(“\n”);//new line*/

需要注意的代码

要添加更多命令,我们只需添加更多IF-()检查右操纵手柄位置的说明,下来,和左边的位置。如果操纵杆处于上述任何位置,发送命令将Redbot向前移动到右侧,反转,向左转,分别。如果操纵杆在中间,我们将发出命令让Redbot海岸稍作改善。否则,当我们不按下D2时,我们将不断发送命令让Redbot停止。

3.2带ATMEGA328P的全机器人控制

在这部分实验中,我们将重复2.2中的步骤,在移动机器人之前接收命令。不是直接向前开,机器人现在可以转动了,反之。

硬件连接

通过USB电缆将Redbot重新连接到计算机。

Mini-B USB电缆插入Redbot

打开素描

将以下代码复制并粘贴到Arduino IDE中。记得,我们需要选择Arduino/Genuino乌诺对于Redbot主板,选择它枚举的对应COM端口,将电源开关拨到接通位置。一旦调整了这些设置,你可以点击上传按钮。

语言:c/*3_2_full_robot_control_atmega328p.ino full robot control atmega328p示例作者:Ho Yun Bobby Chan日期:2/15/19 Sparkfun Electronics许可证:Creative Co亚博官网mmons属性shareLiked 4.0(CC by-SA 4.0)使用此代码执行任何您想要的操作,可用于任何用途。请将此许可证归为属性并保留。远程控制Redbot的第一步是在系链设置中首先将其从串行监视器中驱动出来。这是带有ATMEGA328P的Redbot主板的示例代码。上传这个草图之后,使用USB电缆将Redbot与计算机保持连接。将开关翻到各自的侧面:电机=>运行和电源=>打开。您还需要将UART翻转到Xbee_sw_串行端。假设您在同一个通道上有一对XBee1s(或配置了802.15.4协议的3),一个字符将在XBees之间无线传输。从连接到软件串行定义的插脚的XBEE接收到的任何字符都将传递到串行监视器。对于故障排除,通过串行监视器发送的任何字符都将被回送。尝试测试控制器,看看机器人是否会向前移动或通过串行监视器发送以下字符。A=前进B=前进右转C=后退D=前进左转J=滑行K=发送前进命令时,如果电机不前进,则停止,只需翻转接线即可。您可以调整代码,但这需要调整多行代码。这并不像无线操纵杆例子和Redbot实验9中使用的例子那样,解释了马达的强度。警告:上传到Redbot主板时,请确保将开关切换到xbee-sw-u串行。您在上传代码时会遇到问题,可能会损坏您的xbee.*/包括
       
        //包括Redbot库RedbotMotors电机;//生成redbotchar c_数据的实例;//保存从Xbee到Arduino的输入数据的变量//我们将使用Redbot SoftwareSerial与Xbee进行通信:/(对于ATMega328P的//Xbee的DOUT(TX)连接到插脚14(Arduino的软件Rx)//Xbee的DIN(Rx)连接到插脚15(Arduino的软件Tx)包括
        
         RedBot软件系列RedBotXBee;//创建软件串行实例,修改后的软件串行库中已经定义了管脚//led,用于检查LED是否已初始化。const int status_led=13;void set up()//将两个端口都设置为9600波特。这个值对于xbee来说是最重要的。确保波特率与xbee的配置//设置匹配。redbot xbee.begin(9600);//初始化sw for xbee以接收串行串行。begin(9600);//初始化hw以调试串行监视器//状态LED以查看redbot是否正在初始化pinmode(状态LED,输出;对于(int i=0);I<3;i++)数字写入(状态指示灯,高);//设置状态LED开启延迟(50);数字写入(状态指示灯,低);//设置状态LED关闭延迟(50);}serial.println(“Redbot初始化!”);//end setupvoid loop()if(redbotxbee.available()serial.available())if(redbotxbee.available())c_data=redbotxbee.read();//将接收到的值从xbee存储到变量else if(serial.available())c_data=serial.read();//将接收到的值从串行监视器存储到变量serial.println(“字符收到,“”;serial.write(c_data);//发送到serial monitor serial.println();数字写入(状态指示灯,高);//打开状态指示灯//延迟微秒(500);//添加短延迟指示灯进行反馈,如果它影响性能,则可以将其注释掉,如果(c撊data='a')serial.println(“drive forward”);redbotxbee.write(“a”);数字写入(状态指示灯,高);//打开状态LED电机。驱动(255);//forward else if(c_data==“b”)serial.println(“turn right”);redbotxbee.write(“b”);数字写入(状态指示灯,高);//打开状态LED电机。左电机(-200);//打开左电机电源(motor power=)电机。右电机(100);//打开右侧电机电源(motor power=)else if(c_data='c')serial.println(“reverse”);redbotxbee.write(“c”);数字写入(状态指示灯,高);//打开状态LED电机。驱动(-255);//reverse else if(c_data='d')serial.println(“turn left”);redbotxbee.write(“d”);数字写入(状态指示灯,高);//打开状态LED电机。左电机(-100);//打开左电机电源(motor power=)电机。右电机(200);//打开右侧电机电源(motor power=)else if(c_data='j')serial.println(“coast”);redbotxbee.write(“j”);数字写入(状态指示灯,高);//打开状态LED电机。coast();}else if(c_data='k')serial.println(“stop”);redbotxbee.write(“k”);数字写入(状态指示灯,高);//打开状态LED电机。stop();}}//延时(100);//短暂暂停,因此我们不会不断接收字符digitalwrite(状态指示灯,低);//关闭状态LED//结束循环
        
       

需要注意的代码

类似于3.1,我们再加一个IF-()如果字符与发送的内容匹配,则移动Redbot的语句。当我们收到向右转的指令时,我们会根据每个条件调整电机的功率和方向。反转,向左转,海岸,或者停止。


你应该看到什么

断开控制器和机器人与计算机的连接。按下D2并移动操纵杆。您应该看到Redbot相对于操纵杆的位置朝着方向移动!

无线控制器指挥机器人前进,向后的,左,正确


实验4:无线触发音频

介绍

记得制造与Redbot的声音?在本节中,我们将无线控制蜂鸣器发出熟悉的声音。

需要零件

您需要从所需材料中获得以下零件:

  • 2x XBees(配置为1系列固件)
  • 1根Cerberus电缆(或1根Micro-B USB和1根Mini-B USB电缆)
  • 带Redbot主板的1X组装式阴影机箱
  • 1X压电蜂鸣器
  • 4X AA电池
  • 1个组合式无线操纵杆
  • 1X锂电池

4.1:添加带有SAMD21的音频命令

在这部分实验中,我们将添加一些命令来触发熟悉的声音。

硬件连接

如果你还没有,将XBEE和电池插入控制器。然后通过USB电缆将控制器连接到计算机。

Micro-B USB电缆插入无线操纵杆

打开素描

将以下代码复制并粘贴到Arduino IDE中。记住选择SAMD21 DEV突破对于控制器,选择它枚举的COM端口,将无线操纵杆开关拨到打开位置,然后点击上传。

语言:c/*4_1_full_remote_control_samd_audio.ino full remote control samd21示例,带蜂鸣器,作者:Ho Yun Bobby Chan日期:2/15/19 Sparkfun Electronics许可证:Creative Commons 亚博官网Attribution Sharelike 4.0(CC by-SA 4.0)使用此代码执行任何您想要的操作,可用于任何用途。请将此许可证归为属性并保留。这是SAMD21无线操纵杆的示例代码。通过串行监视器输入的任何字符或满足条件语句时,都将发送到硬件UART管脚。假设您在同一个通道上有一对XBees Series 1模块(或配置了802.15.4协议的Series 3模块),一个字符将在XBees之间无线传输。然后,接收XBee将把字符传递给ATMega328P微控制器,使机器人向前移动。按下D2(如果您在右侧焊接了操纵杆或按钮),将检查左侧的操纵杆。移动操纵杆时将传输一个字符。向上=右前=右前转向向下=左后=左前转向中间=未按下D2时滑行,将发送一个字符以停止电机。按下d6(左触发器)或d3(右触发器)将发送另一个字符:左触发器=硬币右触发器=火球。需要对Redbot进行编程以读取这些值。注意:对于某些XBEE系列3模块,您可能需要将A5连接到无线操纵杆上的XBEE系列3的重置触针。有关详细信息,查看xbee3_reset()函数。*/define l_trig 6//用于左触发器的pin define r_trig 3//用于右触发器的pin boolean prev_button l_state=high;//存储按钮前一状态的值,按Boolean current_buttonl_state=high;//存储按钮当前状态的值,按Boolean Prev_Buttonr_State=high;//存储按钮前一状态的值,按Boolean current_button r_state=high;//存储按钮当前状态的值按define forward_reverse_joystick a3//用于左操纵杆Y组件的销define turn_joystick a2//用于左操纵杆X组件的销布尔值buttonAccelerate_state;define accelerate_button 2//用于右触发器的销//我们将在此处存储模拟操纵杆值int16_t forward_reverse_stick_value;int16_t turnstick_value;char c_data;//通过串行监视器发送值进行调试//LED检查LED是否已初始化。const int status_led=13;//某些XBEE Series 3模块需要define XBEE_reset a5void setup()pinmode(l_trig,输入插拔);//启用左触发PinMode(R_Trig,输入插拔);//启用右触发器serialusb.begin(9600)的上拉电阻;//初始化串行监视器进行调试//如果要等待串行监视器打开,请取消对此的注释。[同时]!SerialUSB);//等待串行监视器打开serialusb.println(“无线操纵手柄控制器初始化”);序列1.开始(9600);//以9600波特的xbee3_reset()与xbee开始串行通信;//如果xbee3初始化有问题,硬件重置PINMODE(加速按钮,输入插拔);//启用加速按钮D2的上拉电阻//状态LED,查看控制器是否正在初始化PINMODE(状态LED,输出;对于(int i=0);I<3;i++)数字写入(状态指示灯,高);//设置状态LED开启延迟(50);数字写入(状态指示灯,低);//设置状态LED关闭延迟(50);}serialusb.println(“无线操纵杆控制器的XBEE准备好通信”);delay(10);//end setupvoid loop()current_button l_state=digitalread(l_trig);当前_按钮r_状态=数字读取(r_Trig);//初始化变量以读取按钮当前按钮Accelerate(加速)状态=DigitalRead(加速)按钮;/***按钮1状态-低或0表示按下-高或1表示未按下****///存储值读取操纵杆前进\后退\斗杆\值=模拟读取(前进\后退\操纵杆);旋转杆_值=模拟读数(旋转操纵杆);//send commands via serial monitor for testing here if(serialusb.available())c_data=serialusb.read();//take character from serial monitor and store in variable serial1.print(c_data);//send to xbee//echo back what was sent to serialusb.println(“sending character here,“”;serialusb.println(c_数据);}if(当前_按钮Accelerate_state==low)serialusb.println(“已按下Accelerate按钮!”);if(正向_反向_Stick_Value>1000)serialusb.println(“正向”);serial1.print('a');//通过同一频道上的XBEE向Redbot传输数字写入(状态_LED,高);//打开状态指示灯//延迟微秒(500);//添加短延迟指示灯进行反馈,如果影响性能,可以将其注释掉;否则,如果(Turnstick_value<20)serialusb.println(“turn right”);serial1.打印(“b”);数字写入(状态指示灯,高);//打开状态指示灯//延迟微秒(500);//添加短延迟指示灯进行反馈,如果影响性能,可以将其注释掉;否则,如果(正向反向斗杆值<20)serialusb.println(“反向”);serial1.打印(“c”);数字写入(状态指示灯,高);//打开状态指示灯//延迟微秒(500);//添加短延迟指示灯进行反馈,如果影响性能,则可以将其注释掉;否则,如果(转向杆_值>1000)serialusb.println(“左转”)。序列1.打印(“d”);数字写入(状态指示灯,高);//打开状态指示灯//延迟微秒(500);//添加短延迟指示灯进行反馈,如果影响性能,则可以将其注释掉。数字写入(状态指示灯,高);//打开状态指示灯serial1.print('j');}//在此处调试左侧模拟操纵杆//边界根据操纵杆的读取值而变化//您可能需要调整要校准的条件语句中的值//需要编写附加条件语句以旋转//并反转serialusb.print(“Forward_Reverse_Stick_Value=”);//~ 1023,~7-9下serialusb.println(正向\反向\棒值);serialusb.println(“turnstick_value=”);//左1023,~5-6右serialusb.println(转盘_值);}else//current_buttonAccelerate_state==high//如果不向驱动器发送命令,自动让机器人停止移动serialusb.println(“停止”);数字写入(状态指示灯,高);//打开状态指示灯serial1.print('k');}如果(当前按钮L_状态=低)如果(上一按钮L_状态!=current_buttonl_state)serialusb.println(“r trigger button has been pressed!”);serialusb.println(“硬币声音”);serial1.print('x');数字写入(状态指示灯,高);//打开状态LED如果(当前_按钮_状态=低)如果(上一个_按钮_状态!=current_buttor_state)serialusb.println(“r trigger button has been pressed!”);serialusb.println(“火球声音”);序列1.打印(“Y”);数字写入(状态指示灯,高);//打开状态LED上一个按钮l_状态=当前按钮l_状态;//保存当前状态prev_buttoner_state=current_buttoner_state;//保存当前状态延迟(100);//增加LED反馈的短延时,如果这会影响数字写入的性能(状态指示灯,低);//关闭状态LED//结束loopvoid xbee3_reset()//硬件重置/*-xbee系列3硬件参考手册-PG 31电源设计建议VCC和GND之间的去耦电容器。使用10uF电容器测试,不使用。这是不必要的。-第60页:褐色检测。这是必需的。在XBEE的重置和A5之间添加跳线https://www.digi.com/resources/documentation/digidocs/pdf s/90001543.pdf-通过接地重置插脚来实现XBEE系列3的电源循环,以避免斜坡上升和变暗检测中的连续性https://www.silabs.com/community/mcu/32-bit/knowledge-base.entry.html/2017/06/14/rmu-e203_Avdd_Ramp-j176-min强制复位时间:EFM32设备=50ns;EFM32PG/JG:Pearl and Jade Gecko=100ns https://www.silabs.com/community/mcu/32-bit/knowledge-base.entry.html/2016/07/22/minimum_reset_holdt-pgld*/pinmode(xbee_reset,输出;数字写入(xbee_重置,高);延迟微秒(1);数字写入(xbee_重置,低);延迟微秒(1);数字写入(xbee_重置,高);/*//软件重置//软件重置不适用于XBEE系列3…需要硬件重置延迟(500);//等待XBEE系列3在硬件重置系列1之后启动。写入(“++“”;//输入命令模式延迟(500);//当XBEE进入命令模式serial1.write(“atfr”);//at命令软件重置serial1.write(“\r”);//carrial返回serial1.write(“\n”);//new line*/

需要注意的代码

添加到当前已定义命令列表中,我们将在顶部为左触发器和右触发器定义另外两个按钮。您会注意到,有额外的代码来跟踪这两个按钮的前一个和当前状态。

再往下循环()命令之后,我们创造了一个嵌套的IF-()陈述对于每一个按钮,我们只发送命令触发蜂鸣器一次当按钮被按下。我们只想在松开按钮后发送这些音频命令。

4.2添加带ATMEGA328P的音频

在这部分实验中,我们将接收字符来控制Redbot上的压电蜂鸣器。

硬件连接

我们假设蜂鸣器像装配指南一样连接到销9上。如果你还没有,将XBEE插入Redbot。然后通过USB电缆将Redbot连接到计算机。

Mini-B USB电缆插入Redbot

打开素描

将以下代码复制并粘贴到Arduino IDE中。

语言:c/*4_2_full_remote_control_samd_audio.ino full robot control atmega328p示例,带蜂鸣器,作者:Ho Yun Bobby Chan日期:2/15/19 Sparkfun Electronics许可证:Creative Commons 亚博官网Attribution Sharelike 4.0(CC by-SA 4.0)使用此代码执行您喜欢的操作,可用于任何用途。请将此许可证归为属性并保留。远程控制Redbot的第一步是在系链设置中首先将其从串行监视器中驱动出来。这是带有ATMEGA328P的Redbot主板的示例代码。上传这个草图之后,使用USB电缆将Redbot与计算机保持连接。将开关翻到各自的侧面:电机=>运行和电源=>打开。您还需要将UART翻转到Xbee_sw_串行端。假设您在同一个通道上有一对XBee1s(或配置了802.15.4协议的3),一个字符将在XBees之间无线传输。从连接到软件串行定义的插脚的XBEE接收到的任何字符都将传递到串行监视器。对于故障排除,通过串行监视器发送的任何字符都将被回送。尝试测试控制器,看看机器人是否会向前移动或通过串行监视器发送以下字符。A=前进B=前进右转C=后退D=前进左转J=滑行K=停止X=硬币硬币音效Y=如果发送前进命令时发动机不前进,则会产生火球音效,只需翻转接线即可。您可以调整代码,但这需要调整多行代码。这并不像无线操纵杆例子和Redbot实验9中使用的例子那样,解释了马达的强度。警告:上传到Redbot主板时,请确保将开关切换到xbee-sw-u串行。您上传代码时会遇到问题,可能会损坏您的xbee.*/包括“pitchs.h”//include pitchs.h from tab include
       
        //包括Redbot库RedbotMotors电机;//生成redbotchar c_数据的实例;//保存从Xbee到Arduino的输入数据的变量//我们将使用Redbot SoftwareSerial与Xbee进行通信:/(对于ATMega328P的//Xbee的DOUT(TX)连接到插脚14(Arduino的软件Rx)//Xbee的DIN(Rx)连接到插脚15(Arduino的软件Tx)包括
        
         RedBot软件系列RedBotXBee;//创建软件串行实例,修改后的软件串行库中已经定义了管脚//led,用于检查LED是否初始化。const int status_led=13;int coin_counter=0;//counter for coins和1-upvoid set up()//将两个端口设置为9600波特。这个值对于xbee来说是最重要的。确保波特率与xbee的配置//设置匹配。redbot xbee.begin(9600);//初始化sw for xbee以接收串行串行。begin(9600);//初始化hw以调试串行监视器//状态LED以查看redbot是否正在初始化pinmode(状态LED,输出;对于(int i=0);I<3;i++)数字写入(状态指示灯,高);//设置状态LED开启延迟(50);数字写入(状态指示灯,低);//设置状态LED关闭延迟(50);}模式(9)输出;//蜂鸣器音调(9,注意事项6125);延迟(130);NOTONE(9);serial.println(“Redbot初始化!”);//end setupvoid loop()if(redbotxbee.available()serial.available())if(redbotxbee.available())c_data=redbotxbee.read();//将接收到的值从xbee存储到变量else if(serial.available())c_data=serial.read();//将接收到的值从串行监视器存储到变量serial.println(“字符收到,“”;serial.write(c_data);//发送到serial monitor serial.println();数字写入(状态指示灯,高);//打开状态指示灯//延迟微秒(500);//添加短延迟指示灯进行反馈,如果它影响性能,则可以将其注释掉,如果(c撊data='a')serial.println(“drive forward”);redbotxbee.write(“a”);数字写入(状态指示灯,高);//打开状态LED电机。驱动(255);//forward else if(c_data==“b”)serial.println(“turn right”);redbotxbee.write(“b”);数字写入(状态指示灯,高);//打开状态LED电机。左电机(-200);//打开左电机电源(motor power=)电机。右电机(100);//打开右侧电机电源(motor power=)else if(c_data='c')serial.println(“reverse”);redbotxbee.write(“c”);数字写入(状态指示灯,高);//打开状态LED电机。驱动(-255);//reverse else if(c_data='d')serial.println(“turn left”);redbotxbee.write(“d”);数字写入(状态指示灯,高);//打开状态LED电机。左电机(-100);//打开左电机电源(motor power=)电机。右电机(200);//打开右侧电机电源(motor power=)else if(c_data='j')serial.println(“coast”);redbotxbee.write(“j”);数字写入(状态指示灯,高);//打开状态LED电机。coast();}else if(c_data='k')serial.println(“stop”);redbotxbee.write(“k”);数字写入(状态指示灯,高);//打开状态LED电机。stop();}否则,如果(c_data='x')//播放硬币声音序列号.println(“硬币声音”);if(coin_counter<100)coin_counter=coin_counter+1;//添加1个coin-serial.print(“coin counter=”);serial.println(硬币计数器);redbotxbee.write(“x”);数字写入(状态指示灯,高);//打开LED灯(9,注意事项B5,100);延迟(50);音调(9)注意事项6850);延迟(400);NOTONE(9);}否则,如果(coin_counter<=100)coin_counter=0;//将硬币设置回0;连续打印(“收到100个硬币!1-UP);serial.print(“硬币计数器重置为=”);serial.println(硬币计数器);redbotxbee.write(“x”);数字写入(状态指示灯,高);//打开状态LED音调(9,注意事项6125);延迟(130);音调(9)注意事项G6125);延迟(130);音调(9)注意事项7125);延迟(130);音调(9)No.7125);延迟(130);音调(9)No.7125);延迟(130);音调(9)注意事项G7125);延迟(125);NOTONE(9);}}否则,如果(c_data='y')//播放硬币声音序列号.println(“火球声音”);redbotxbee.write(“y”);数字写入(状态指示灯,高);//打开状态指示灯//播放火球声音音调(9,注意事项G435);延迟(35);音调(9)注意事项:35);延迟(35);音调(9)注意事项G635);延迟(35);NOTONE(9);}}//延时(100);//短暂暂停,因此我们不会不断接收字符digitalwrite(状态指示灯,低);//关闭状态LED//结束循环
        
       

添加选项卡式文件

连同例子,您需要包括以下内容音高头文件最初是布雷特·哈格曼写的.你可能记得这个正在命名的文件注意事项.使音高文件,单击串行监视器图标下方的箭头按钮,然后选择“新建选项卡”,或使用Ctrl键+换档+n捷径。将文件命名为音高帮助分解示例草图。

在Arduino IDE中创建选项卡式文件

复制并粘贴以下代码Arduino IDE的新选项卡并保存。因此,新文件将与示例代码包含在同一文件夹中。记得,我们需要选择Arduino/Genuino乌诺对于Redbot主板,选择它枚举的对应COM端口,将电源开关拨到接通位置。一旦调整了这些设置,你可以点击上传按钮。

语言:C/****************************************************************************************************************************************/35;定义注释“U B031”定义注释“U C1 33”定义注释“U CS1 35”定义注释“U D1 37”定义注释“U DS1 39”定义注释“U E1 41”定义注释“U F1 44”定义注释定义注释“U FS1 46”定义注释“U G1 49”定义注释“U GS1 52”定义注释“U GS1 52”定义注释“U GS1 52”定义注释“U GS1 52”定义注释“U GS1 52”定义注释“U GS1 52”定义注释“U GS1 52定义注释TE_AS1 58#define NOTE_B1  62#define NOTE_C2  65#define NOTE_CS2 69#define NOTE_D2  73#define NOTE_DS2 78#define NOTE_E2  82#define NOTE_F2  87#define NOTE_FS2 93#define NOTE_G2  98#define NOTE_GS2 104#define NOTE_A2  110#define NOTE_AS2 117#define NOTE_B2  123#define NOTE_C3  131#define NOTE_CS3 139#define NOTE_D3  147#define NOTE_DS3 156#define NOTE_E3  165#define NOTE_F3  175#define NOTE_FS3 185#define NOTE_G3  196#define NOTE_GS3 208#define NOTE_A3  220#define NOTE_AS3 233#define NOTE_B3  247#define NOTE_C4  262#define NOTE_CS4 277#define NOTE_D4  294#define NOTE_DS4 311#define NOTE_E4  330#define NOTE_F4  349#define NOTE_FS4 370#define NOTE_G4  392#define NOTE_GS4 415#define NOTE_A4  440#define NOTE_AS4 466#define NOTE_B4  494#define NOTE_C5  523#define NOTE_CS5 554#define NOTE_D5  587#define NOTE_DS5 622#define NOTE_E5  659#define NOTE_F5  698#define NOTE_FS5 740#define NOTE_G5  784#define NOTE_GS5 831#define NOTE_A5  880#define NOTE_AS5 932#define NOTE_B5  988#define NOTE_C6  1047#define NOTE_CS6 1109#define NOTE_D6  1175#define NOTE_DS6 1245#define NOTE_E6  1319#define NOTE_F6  1397#define NOTE_FS6 1480#define NOTE_G6  1568#define NOTE_GS6 1661#define NOTE_A6  1760#define NOTE_AS6 1865#define NOTE_B6  1976#define NOTE_C7  2093#define NOTE_CS7 2217#define NOTE_D7  2349#define NOTE_DS7 2489#define NOTE_E7  2637#define NOTE_F7  2794#define NOTE_FS7 2960#define NOTE_G7  3136定义注释定义注释定义注释定义注释定义注释定义注释定义注释定义注释定义注释定义注释定义注释定义注释定义注释DS8 4978

需要注意的代码

我们将包括音高文件在示例的开头引用注释。然后我们将设置蜂鸣器并播放声音以确保蜂鸣器按预期工作。进一步在循环()在我们的条件语句之后,我们会加几行,让蜂鸣器播放一系列音符。如果按下其中一个触发器100次,我们将演奏一段特殊的音符序列。


你应该看到(听到)

按下控制器上的触发器。你应该听到一个熟悉的8位声音效果从一个流行的游戏来自压电蜂鸣器!按下其中一个触发器100次以听到另一个熟悉的声音!

编码挑战

向机器人大军广播

还记得教程开头显示的GIF吗?它们被用来对Xbee3和本教程中使用的示例进行压力测试。不是控制一个机器人,尝试将命令从一个控制器广播到几个机器人!只需确保为您的XBee配置唯一的地址,并调整控制器的广播配置.

同时控制3个机器人的无线操纵杆

更多按钮

Redbot电机转速设定为一个强度。不是为每个字符设置一个电机强度,尝试使用其他按钮来划分不同字符的电机强度。或者尝试调整代码使机器人向左或向右旋转。

串行传输方法

不是发送一个字符来移动,尝试调整代码以传输不同的电机强度,并使用XBEE的API数据包结构。或者尝试通过网状网络配置发送串行数据。您需要将数据解析为数组,并将字符串转换为与中提供的示例代码类似的数字。远程油箱转向马达控制器.不是将角色发送到Redbot,该示例使用串行控制的电机驱动程序向Arduino发送了一系列字符。

用传感器控制

不用按钮和操纵杆,尝试使用运动传感器根据套件中包含的Redbot加速度计之类的移动来控制Redbot。或者做一只手套,根据手势控制Redbot。

亚博官网Sparkfun Qwiic柔性手套控制器

亚博官网Sparkfun Qwiic柔性手套控制器

SEN-14666
39.95美元
亚博官网Sparkfun Redbot传感器-加速度计

亚博官网Sparkfun Redbot传感器-加速度计

SEN-12599
9.95美元

硬件升级

记得,有点额外的活动硬件切入阴影底盘!

演员升级!

试着加一个伺服爪来抓起一个像笔一样的小物体。这是一个伺服和我们目录中的动作部分退房。

伺服-通用(亚微型)

伺服-通用(亚微型)

ROB-09065
8.95美元
十一
平移/倾斜支架套件(多附件)

平移/倾斜支架套件(多附件)

ROB-10335
5.95美元
微夹持器套件B-轮毂安装

微夹持器套件B-轮毂安装

ROB-13177
5.95美元
铝槽-4.50

铝槽-4.50”

ROB-12122
4.99美元

锂离子电池监测

如果您查看无线控制器的指南,你会注意到有一些例子可以监视你的锂电池!尝试将代码与锂离子电池显示器和微型OLED显示器.

用微型OLED监控锂离子电池
用微型OLED监控锂离子电池

感知环境

尝试从Redbot工具包中使用的传感器或编码器后面的行将数据发送回控制器。更好的是,添加空气质量传感器湿度和温度传感器在一个像行星探测车.您需要连接串行监视器或微型OLED才能查看数据。

亚博官网Sparkfun空气质量突破-CCS811

亚博官网Sparkfun空气质量突破-CCS811

SEN-14193
20.95美元
亚博官网Sparkfun湿度和温度传感器分接头-SI7021

亚博官网Sparkfun湿度和温度传感器分接头-SI7021

SEN-13763
7.95美元
十一

高效地发送命令

尝试修改代码以提高效率和节约能源,而不是不断地发送命令。目前,控制器反复发送命令通知Redbot停止,即使我们不按任何按钮。


故障排除

不按预期工作?下面是一些故障排除提示,以使您的micro:bits按预期工作。为了您的方便,相关故障排除提示Redbot实验指南包括在下面。

  • 上载时出现问题?

    • 确保你的USB线同时插入机器人和你用来写代码的电脑。
    • 确保“电源”开关切换到“打开”。
    • 再次检查您是否在“工具”菜单下选择了正确的串行端口。最简单的检查方法是当你拔掉USB线的时候,看看哪个项目会从菜单中消失。当你重新插入电路板时,选择那个。
    • 如果您插入了XBEE模块,确保板顶部边缘的串行选择开关切换到“XBEE SW SERIAL”。
    • 检查是否在“工具”菜单下选择了正确的电路板。无线操纵杆使用“亚博官网sparkfun samd21 dev突破“当Redbot主板使用时”微控制器“。还要确保为每个板选择了正确的COM端口。

  • 我的红机器人不动了!

    • 确保开关设置在正确的电源位置,马达,和xbee sw-serial。
    • 如果你使用电池,确保他们有足够的力量。
    • 确保XBees配置正确。

  • 我的Redbot不是直开的!它在旋转或向后行驶!

    • 确保电机接线正确。
    • 您还可以调整代码来告诉电机旋转的方向。由于代码基于Redbot程序集指南中使用的设置,调整物理接线更容易。

  • 我的Redbot不是直开的!它在曲线上行驶!

    • 这对Redbot来说很常见,所有带独立驱动轮的机器人。原因很多,但这是必须处理的事情。以下是几个可能的原因:
      • 首先——检查以确保车轮或磁电机编码器上没有摩擦。把轮子移开,这样它们就不会摩擦了。但仍然紧紧地固定在电机中。一侧增加的任何摩擦力都会导致一侧的行驶速度超过另一侧(导致Redbot向一侧拉动)。
      • 第二——直行需要两个轮子的功率相等。这要求两个车轮具有相等的牵引力。以最大功率运转电机有时会导致车轮“打滑”并失去牵引力。试着把发动机功率降低到低于255。
      • 第三——使用工具包中的编码器确保两个轮子每次转动的距离相同。


资源和进一步发展

需要灵感吗?看看我们在机器人部分找到的其他机器人。

大型简易驾驶员连接指南

如何开始使用SparkFun大易用驾驶员。亚博官网

制造一辆自主车辆:蝙蝠车

在2016年的Sparkfun自动驾驶汽车大赛(亚博官网AVC)上记录一个为期六个月的自主动力车轮竞赛项目。亚博官网

激光雷达Lite v3连接指南

将Garmin Lidar Lite v3或Lidar Lite v3hp连接到Arduino以测量距离的教程。

带micro:bit的无线遥控器

在本教程中,我们将利用makecode无线电模块让一个micro:bit向同一个频道上的接收micro:bit发送信号。最终,我们将使用Arcade:Kit中的部件无线控制micro:bot!

或者试试看这些来自AVC的酷机器人.


亚博在线娱乐官网学习.spa亚博官网rkfun.comγCC BSA SA 3| 亚博官网Sparkfun电子公司科罗拉多州

RHT03(DHT22)湿度和温度传感器连接指南 博博霍 https://www.亚博官网sparkfun.com/users/9610 urn:uuid:0c95bde1-45e5-99ce-0b0d-406399d67474 2019年3月12日00:00:00-06:00

RHT03(DHT22)湿度和温度传感器连接指南亚博在线娱乐官网learn.亚博官网sparkfun.com教程

可在线访问:http://sfe.io/t876

介绍

使用连接到Arduino的单线数字接口上的RHT03(A.K.A DHT22)低成本传感器测量相对湿度和温度!

湿度和温度传感器-RHT03

湿度和温度传感器-RHT03

SEN-10167
9.95美元
二十八

所需材料

要遵循本教程,你需要以下材料。但你可能并不需要一切,这取决于你拥有什么。把它加入你的购物车,通读指南,并根据需要调整推车。

建议阅读

如果您不熟悉以下概念,我们建议在继续之前先查看这些教程。

安装Arduino库

如何安装自定义Arduino库?这很容易!本教程将介绍如何使用Arduino库管理器安装Arduino库。对于未与Arduino IDE链接的库,我们还将继续手动安装Arduino库。

什么是Arduino?

这到底是什么“阿杜诺”的东西?

安装Arduino IDE

在Windows上安装和测试Arduino软件的分步指南,雨衣,和Linux。

如何安装ftdi驱动程序

如何在Windows上安装FTDI基本版的驱动程序,Mac OS X,和Linux。

硬件概述

引脚

RHT03(DHT22)的针脚标记在下图中。

注释RHT03

RHT03(DHT22) 笔记
录像机 输入电压介于3.3-6V直流
运输终端交货 数据输出
N/C 未连接
GND 地面

硬件连接

如下图所示,将rht03连接到Arduino。因为我们使用的是5伏Arduino,我们将使用5伏电压为传感器供电。如果使用3.3V Arduino,您需要将其连接到各自开发板的3.3V插脚。

电路摩擦图

库安装

注:此示例假定您正在桌面上使用最新版本的Arduino IDE。如果这是你第一次使用Arduino,请回顾我们的教程 安装Arduino IDE。如果您以前没有安装过Arduino库,请查看我们的 安装指南。

我们写了一个Arduino图书馆,让阅读rht03变得轻而易举。您需要手动安装Rht03 Arduino图书馆通过下载*拉链.一旦下载,点击草图>包含库>添加.zip库…要让Arduino IDE将库解压缩到它各自的文件夹中。

阿杜诺示例

安装库之后,单击打开Arduino IDE中的示例文件>实例>亚博官网Sparkfun Rht03 Arduino图书馆>rht03系列示例.选择您正在使用的板(如果您正在使用带有ATMEGA328P的RedBoard,选择Arduino/Genuino乌诺)和主板上枚举的COM端口,点击上传。

带有突出显示的上载按钮的Arduino IDE

打开串行监视器9600波特查看输出。相对湿度和温度应以°F和°C为单位。尝试向传感器吹气。传感器应该对呼出的空气中的水蒸气作出反应。

输出相对湿度和温度示例

更多例子

寻找更多的例子?查看以下教程,阅读传感器与其他开发板!

ESP8266

如果将ESP8266与RHT03(DHT22)配合使用,尝试签出物联网实验1实验指南从传感器获取温度和湿度数据,并将其发送到ThingsPeak通道。

ESP8266事件示例
ESP8266实例

粒子光子

如果将粒子光子与rht03(dht22)一起使用,尝试签出Sparkfun发明家光子实验指南实验6亚博官网用光电管读取串行数据。

粒子光子示例
粒子光子示例

资源和进一步发展

现在你已经成功地启动了rht03,是时候把它纳入你自己的项目了!亚博官网更多信息,查看以下资源:

寻找更多监控环境的例子?查看以下教程。

亚博官网Sparkfun发明家光子实验工具包指南

利用Sparkfun发明家的光子工具包,深入物联网的世界。亚博官网

TMP102数字温度传感器连接指南

如何连接和使用带Arduino的Sparkfun数字温亚博官网度传感器分接头-TMP102。

MAX31005颗粒和脉冲氧传感器连接指南

Spar亚博官网kfun Max30105颗粒传感器是一种灵活而强大的传感器,能够感应距离,心率,粒子检测,甚至是眨眼。准备好。集合。闪耀!

HIH-4030湿度传感器连接指南

使用Sparkfun的HIH-4030湿度传感器分接头测量相对亚博官网湿度。

亚博在线娱乐官网学习.spa亚博官网rkfun.comγCC BSA SA 3| 亚博官网Sparkfun电子公司科罗拉多州

ESP32 Thing Plus连接指南 埃尔C https://www.亚博官网sparkfun.com/users/9578 urn:uuid:d773f9bb-5e41-d5b1-f213-538b90dd04cf 2019年3月7日00:00:00-07:00

ESP32 Thing Plus连接指南亚博在线娱乐官网learn.亚博官网sparkfun.com教程

可在线访问:http://sfe.io/t852

介绍

这个亚博官网Sparkfun ESP32 Thing Plus享受ESP32的所有便利设施,但加上一些火花。我们把木板加长了一点,以适应QWIC连接器,满足您的QWIIC分接需要。我们还移动了一些别针使板与Adafuit Huzzah32–ESP32羽毛板兼容,这样您就可以使用所有这些可爱的防护罩可用外面!ESP32 Thing Plus还集成了丰富的外围设备,从电容式触摸传感器,霍尔传感器SD卡接口,以太网,高速SPIUART我S和IC.

亚博官网Sparkfun Thing Plus-ESP32警告

亚博官网Sparkfun Thing Plus-ESP32警告

WRL 1468
20.95美元
尚未实施ESP32的Arduino董事会定义仍在进行中。还有一些外围设备和功能尚未实现,包括:
*模拟输入(`analogread([pin])`)
*模拟输出(`analogwrite([pin],[价值])
*WiFi服务器和WiFi UDP
*实时时钟
*触摸控制器接口

这些外围设备可用(如果,也,仍处于婴儿期) 物联网开发框架对于ESP32。如果您的应用程序需要模拟输入,RTC或上述任何特征,考虑给予 ESP-IDF试一试!

所需材料

ESP32 Thing Plus的大部分功能都可以通过简单地为电路板供电来使用。这样做,你需要一个Micro-B USB电缆.ESP32 Thing Plus的USB接口可用于为芯片供电和编程。一旦你完成了芯片的编程,一5伏micro-b USB墙适配器可用于为电路板供电。

墙壁适配器电源-5V DC 2A(USB micro-B)

墙壁适配器电源-5V DC 2A(USB micro-B)

TL—12890
5.95美元
十六
USB micro-B电缆-6英尺

USB micro-B电缆-6英尺

CAB-10215
4.95美元
十二
USB壁装充电器-5伏,1A(黑色)

USB壁装充电器-5伏,1A(黑色)

TL—11456
3.95美元
USB micro-B电缆-6

USB micro-B电缆-6”

CAB-13244
1.95美元

作为替代电源,ESP32 Thing Plus包括对亚博国际官网单细胞锂聚合物(Lipo)电池,插入板的白色2针JST连接器。Lipos非常适合进行中的项目,亚博官网或者那些只需要一点额外的裁判员。董事会包括脂充电器--充电电池可以通过将ThingPlus插入一个5伏的USB电源来充电。

锂离子电池-2ah

锂离子电池-2ah

PRT-13855
12.95美元
锂离子电池-1小时

锂离子电池-1小时

PRT-13813
9.95美元
锂离子电池-400毫安时

锂离子电池-400毫安时

PRT-13851
4.95美元
锂离子电池-850mAh

锂离子电池-850mAh

PRT-13854
9.95美元

如果您希望利用板的QWIIC功能,您需要QWIIC电缆:

QWIIC电缆-100毫米

QWIIC电缆-100毫米

PRT-14427
1.50美元
QWIIC电缆-200毫米

QWIIC电缆-200毫米

PRT-14428
1.50美元
QWIIC电缆-500 mm

QWIIC电缆-500 mm

PRT-14429
1.95美元
QWIIC电缆-50毫米

QWIIC电缆-50毫米

PRT-14426
0.95美元

工具

为了利用ESP32 Thing Plus的28个外部插脚,你需要一个烙铁,焊料,和一般焊接附件.

分离收割台-直

分离收割台-直

PRT-0116
1.50美元
二十
无铅焊锡-100克线轴

无铅焊锡-100克线轴

TL—09325
7.95美元
WELLER WLC100焊接站

WELLER WLC100焊接站

TL—14228
44.95美元

建议阅读

可能看起来很吓人,但是,ESP32的东西加上——特别是当你利用它的ARDUINO兼容性——对于所有体验水平的电子用户来说是完美的物联网基础。有,然而,在深入本教程之前,您应该熟悉一些概念。如果下面的任何概念对你来说都是陌生的,首先考虑阅读本教程:

如何焊接:通孔焊接

本教程涵盖了关于通孔焊接的所有知识。

串行通信

异步串行通信概念:数据包,信号电平,波特率,UART和更多!

如何为项目供电亚博官网

帮助您确定项目电源需求的教程。亚博官网

什么是Arduino?

这到底是什么“阿杜诺”的东西?

硬件概述

Espressf的ESP32房间是强大的,通用Wi-Fi+BT+BLE单片机模块,面向各种应用。该模块的核心是ESP32-D0WDQ6芯片,该芯片设计为可扩展和自适应。它的洗衣功能包括:

  • XTensa®双核32位LX6微处理器
  • 最高240兆赫时钟频率
  • 16MB闪存
  • 520KB内部SRAM
  • 集成802.11 bgn WiFi收发器
  • 集成双模蓝牙(经典和BLE)
  • 2.3至3.6V工作范围
  • 21 GPIO
  • 8电极电容触摸支持亚博国际官网
  • 硬件加速加密(AES,Sa2椭圆曲线密码体制RSA-4096
  • 2.5微安深睡眠电流

ESP32 Thing Plus是围绕ESP32-Wroom模块设计的,具有运行和编程微控制器所需的一切功能。再加上一些额外的优点来利用芯片的独特功能。

带注释的顶部图表

外围设备和I/O

ESP32 Thing Plus提供您的标准硬件外围设备费用,包括:

  • 13个模数转换器(ADC)通道
  • 3个UART(默认情况下,Arduino IDE中只配置了两个UART,一个UART用于引导/调试)
  • 3 SPI(默认情况下,Arduino IDE中只配置了一个SPI)
  • 2我C(默认情况下,Arduino IDE中只配置了一个)
  • 2 I2S音频
  • 2个数模转换器(DAC)通道
  • 16个PWM输出

而且,多亏了芯片管脚多路复用特征,这些外围设备可以连接到任何断开的I/O引脚。这意味着你决定了哪些管脚是RX,TX味噌,莫西SCLKSDA,SCL,等。

有,然而,一些硬件特性——即ADC和DAC——被设计成静态管脚。下面的图形数据表有助于演示在哪里可以找到这些外围设备(单击Embiggen!).

图形数据表

单击图像以更近距离查看。

一我C两个UART接口,其中一个SPI接口可以分配给您的项目需要的任何管脚。亚博官网

仅输入插脚:A2,A3A4

引脚34(A2),36(A4),39(A3)不能配置为输出,但它们可以作为数字输入,模拟输入,或用于其他特殊目的。还要注意他们没有内部上拉或下拉电阻,像其他I/O管脚一样。

GPIO插脚36-39是用于ADC的超低噪声前置放大器的一个组成部分-它们连接到270pF电容器,这有助于配置前置放大器的采样时间和噪声。

针脚34-39的示意图特写

ESP32事物示意图:gpio 36-39用盖子绑在一起。GPIO 36-39以及针脚34和35仅输入

为ESP32 Thing Plus供电

ESP32 Thing Plus的两个主要电源输入是通用串口总线和A单细胞锂聚合物(Lipo电池。如果USB和Lipo都插到板上,车载充电控制器将以高达500毫安.

ESP32的工作电压范围为 二点二3.6V.在正常操作下,ESP32 Thing Plus将在 3.3V.I/O引脚是 不耐5V!如果将电路板与5V(或更高)组件连接,你需要做一些 逻辑电平转换.

这个3.3V调节器在ESP32 Thing Plus罐上可靠供电,高达600毫安,对于大多数项目来说,这应该是足够的开销。亚博官网ESP32的拉力可以达到射频传输时为250毫安,但我们一般都是通过测量来消费150毫安--即使是通过WiFi主动传输。调节器的输出也被分解到电路板的侧面——标有“的针脚3V3“。此销可用于供应外部部件。

ESP32电源输入/输出

除了USB和电池连接器,这个VBAT,和VUSB所有的别针都从木板的侧面折断了。这些管脚可作为Thing Plus的备用电源输入。最大值,允许电压输入VUSB是5.8V,而vbat不应连接到除锂离子电池以外的任何其它电池上。或者,如果您的电压源在2.2V3.6V,“3V3“生产线可用于直接供应ESP32及其外围设备。

装配小窍门

ESP32 Thing Plus的船上没有任何焊接在头销中的东西——确保您可以塑造最适合您的项目的板。亚博官网要使用芯片的管脚,你需要焊接某物至I/O和电源轨的通孔,在板的任一侧断开。

刚开始焊接?看看我们的 通孔焊接教程简单介绍一下!

什么焊接到ESP32 Thing Plus的I/O管脚完全由您决定。标题行与breadboard兼容,所以你可能想焊接男性头在。

ESP32公头焊接件
带焊接公头的ESP32 Thing Plus。

然后把它插到面包板上,将USB和Lipo连接器从一端挂起,开始接线!

或者,女性头(您可能需要两个单独的条带来焊接所有的针)。直角收割台,或绞合线都是不错的选择,取决于项目的需要。亚博官网

软件设置

注:此示例假定您正在桌面上使用最新版本的Arduino IDE。如果这是你第一次使用Arduino,请回顾我们的教程 安装Arduino IDE。

ESP32 Thing Plus的安装是双重的。就像ESP32一样,您将希望通过Arduino Boards Manager安装板定义。此外,您还需要下载并安装CP2104 USB驱动程序。

安装板定义

Espressf已经为Arduino董事亚博国际官网会经理增加了支持,其中包括一系列伟大的内置示例。有关通过Board Manager安装的说明,请访问Espressf的Arduino-ESP32 Github.

有关通过Arduino Board Manager安装板的更多信息,退房安装Arduino IDE教程的附加组件部分.

安装Arduino IDE

3月26日,二千零一十三

在Windows上安装和测试Arduino软件的分步指南,雨衣,和Linux。

如果您熟悉通过Arduino IDE板管理器安装板,要添加的URL是:

语言:chttps://dl.espressf.com/dl/package\u esp32\u index.json
注:如果您以前安装过ESP32 Arduino核心,强烈建议在通过Boards Manager安装之前删除相关文件夹。

要删除以前为ESP32安装的Arduino核心,从找到你的 …/Arduino/硬件文件夹。这可以通过查看下面的草图册位置找到 文件> 偏好.

单击放大。

在查找工具中转到此位置并删除 ESP32文件夹。


一旦删除 ESP32文件夹,然后可以使用 Arduino董事会经理.

选择板定义

一旦安装,在Arduino板下拉列表中使用adafruit esp32羽毛板。

在Arduino板下拉列表中选择adafruit esp32羽毛板
从中选择板定义工具下拉菜单。


安装CP2104 USB驱动程序

您还需要安装Silabs CP2104驱动程序,可以在这里找到:USB到UART网桥VCP驱动程序

注:如果适用的话,确保为CPU体系结构使用正确的驱动程序文件。这通常由文件夹或文件名表示,其中 x86“对于32位处理器或” X64“对于64位处理器。

安装了ESP32 Arduino核心,您已经准备好开始编程了。如果你还没有,将ESP32 Thing Plus插入计算机使用Micro-B USB电缆。

ESP32 Thing Plus插在面包板上

一旦插上电路板(并安装了驱动程序),则它应该被分配一个唯一的端口标识符。在Windows计算机上,这会是像com,在Mac或Linux计算机上,它将以/dev/tty.usbserial-xxxx版本.

选择板和端口

确保在您的工具>董事会菜单。

Arduino板选择

然后选择您的ESP32 Thing Plus串行端口工具>端口菜单。

ESP32 Thing Plus的端口选择

您也可以选择上传速度:“921600”波特——最快的可选择速率——将最快的代码加载到ESP32上,但有时可能无法上传。(提速还是值得的!)

加载眨眼

为了确保你的工具链和木板设置正确,我们将上传最简单的草图——眨眼!连接到的LEDGPIO 13非常适合这个测试。另外,将ESP32连接到您的计算机上,现在是测试串行通信的好时机。将下面的示例草图复制并粘贴到新的Arduino草图中:

语言:cint ledpin=13;void setup()pinmode(ledpin,输出;serial.begin(115200);void loop()serial.println(“你好,世界!”;数字写入(ledpin,高);延迟(500);数字写入(ledpin,低);延迟(500);

一切都设置正确,上传代码!一旦代码完成传输,打开串行监视器并将波特率设置为十一万五千二百.你应该看看你好,世界!开始飞驰而过。

如果蓝色指示灯仍然暗着,它可能还在引导装载程序中。上传草图后,你可能需要 点击RST按钮为了让你的ESP32 Thing Plus开始运行草图。

串行端口输出示例

您还可能注意到,当ESP32启动时,它会打印出一长串调试消息。每次芯片复位时都会发出这些信号——总是在115200波特.

Arduino示例:WiFi

ESP32 Arduino核心包括一些WiFi示例,它展示了正在扫描附近的网络向客户机服务器发送数据。 您可以在下面找到示例文件>实例>无线网络菜单。

下面是另一个使用WiFi库的例子,它演示了如何连接到附近的WiFi网络并轮询远程域。(http://example.com网站/作为客户。

语言:C包括
       
        //wifi网络名称和密码:const char*network name=“your_network_here”;const char*networkpswd=“your_password_here”;//从以下位置请求的Internet域:const char*hostdomain=“example.com”;const int hostport=80;const int button_pin=0;const int led_pin=5;void setup()//initilize hardware:serial.begin(115200);pin模式(按钮\u pin,输入插拔);pin模式(LED_pin,输出;//连接到wifi网络(请参见下面的功能循环)connect to wifi(networkname,网络PSWD;数字写入(LED_引脚,低);//LED关闭serial.print(“按下按钮0连接”);serial.println(hostdomain);void loop()if(digitalread(button_pin)==low)//检查按钮是否在按下的同时(digitalread(button_pin)==low);//等待按钮释放DigitalWrite(LED_pin,高);//打开LED请求URL(hostdomain,主机端口);//连接到服务器DigitalWrite(LED_-Pin,低);//关闭LED void connecttowifi(const char*ssid,const char*pwd)int ledstate=0;打印行();serial.println(“连接到WiFi网络:”+string(ssid));WiFi。开始(ssid,随钻测井;同时(wifi.status()!=wl_connected)//连接时LED闪烁:DigitalWrite(LED_pin,莱德邦);ledstate=(ledstate+1)%2;//翻转LED状态延迟(500);序列号。打印(“.”);}serial.println();serial.println(“WiFi已连接!”);serial.print(“IP地址:”);serial.println(wifi.localip());void requesturl(const char*主机,uint8_t port)printline();serial.println(“连接到域:”+string(host));//使用wificlient类创建TCP连接wificlient客户端;如果(!)client.connect(主机,port))serial.println(“连接失败”);返回;}serial.println(“已连接!”);打印行();//这将向服务器客户端发送请求。print((string)“get/http/1.1 \r\n”+“主机:”+string(host)+“\r\n”+“连接:关闭\r\n\r\n”);无符号长超时=毫秒();while(client.available()==0)if(millis()-timeout>5000)serial.println(“>>>client timeout!”);客户机停止();返回;}}//从服务器读取回复的所有行,并将其打印到serial while(client.available())string line=client.readStringUntil('\r');序列号。打印(行);}serial.println();serial.println(“关闭连接”);client.stop();void printline()serial.println();对于(int i=0);I<30;i++)串行.print(“-”);serial.println();
       

确保填写网络名称网络PSWD变量与您的WiFi网络的名称(或SSID)和密码!一旦你完成并上传了代码,打开你的串行监视器.

WiFi示例串行终端输出

ESP32连接到WiFi网络后,它将等待您按下“0”按钮。轻敲将导致ESP32发出HTTP请求范例网站.您应该会看到一个与上面的屏幕截图类似的HTTP头和HTML字符串。

Arduino示例:ESP32 BLE

Board Manager Install和ESP32 Arduino Core Install都提供了蓝牙示例,从串行到串行,再到充当简单的BLE设备,再到充当蓝牙服务器或客户端。在这里,我们将简要介绍白描可在中找到的示例文件夹>实例>ESP32布尔阿尔杜诺.此示例允许您在手机上写入消息,然后在计算机的串行监视器中读取这些消息。

此示例适用于BLE扫描仪在你的电话上。好的,基本应用程序是用于苹果手机安卓.请确保安装应用程序以遵循此示例。

编译并上传以下代码,如果你愿意,打开白描示例来自文件夹>实例>ESP32布尔阿尔杜诺菜单。确保你有ESP32 DEV模块因为您的板和正确的端口已被选择。

语言:c/*基于Neil Kolban示例,例如idf:https://github.com/nkolban/esp32 snippets/blob/master/cpp_utils/tests/ble%20tests/samplewrite.cpp,由Evandro Copercini*/包括移植到Arduino ESP32
       
        包括:
        
         包括:
         
          //有关生成uuids的信息,请参见以下内容://https://www.uuidGenerator.net/define service_uid“4fafc21-1fb5-459e-8fcc-c5c9c331914b”define characteristic_uid“beb5483e-36e1-4688-b7f5-ea07361b26a8”类mycallbacks:public bleCharacteristicCallbacks void onWrite(bleCharacteristic*pcharacteristic)std::string value=pcharacteristic->getValue();if(value.length()>0)serial.println(“*******”);serial.print(“新值:”);对于(int i=0);i<value.length();i++)serial.print(值[i]);serial.println();serial.println(“*******”);}}};void setup()serial.begin(115200);serial.println(“1-在手机中下载并安装BLE扫描仪应用程序”);serial.println(“2-在应用程序中扫描BLE设备”);serial.println(“3-连接到myesp32”);serial.println(“4-进入定制服务中的定制特性并写一些东西”);serial.println(“5-参见magic=)”;bledevice::init(“myesp32”);bleserver*pserver=bledevice::createserver();bleservice*psservice=pserver->createService(服务Uuid);bleCharacteristic*pcCharacteristic=psService->CreateCharacteristic(特征bleCharacteristic::property_read bleCharacteristic::property_write);pcharacteristic->setCallbacks(new myCallbacks());pcharacteristic->setvalue(“hello world”);pservice->start();bledvertising*padvertising=pserver->getAdvertising();padVertizing->start();void loop()//将主代码放在这里,重复运行:延时(2000);
         
        
       

一旦你上传了你的代码,打开一个串行监视器设置在115200波特所以你可以看到我们将要写的信息。

Arduino串行监视器ESP32

然后打开你的BLE扫描仪手机上的应用程序。您将看到多个选项;滚动浏览这些并连接到MYESP32.

连接到myesp32

现在我们需要钻取到我们想要的通信能力。一旦连接到MYESP32,您将进入下一页。选择定制服务.

选择自定义服务

下一页将向您显示通信和这样做的选项。选择读写.

选择写入、读取

最后,我们可以选择允许我们编写消息的选项。选择写入值.

选择写入

现在我们可以写信息了。确保您选择文本,给自己写条信息,然后单击按钮。

写下你的信息!

那么现在呢?去看看你的串行监视器。你应该看到”新价值:“带着你的信息。

在串行监视器上接收到消息

这只是对所提供示例之一的快速浏览。我们建议您仔细查看所提供的其余示例,并使用代码来查看哪些内容适用于您的应用程序。有关蓝牙技术及其工作原理的更多信息,看看我们的蓝牙基础教程.

资源和进一步发展

有关ESP32 Thing Plus的更多资源,查看以下链接:

Espressf在ESP32的基础上拥有大量的资源:

更多ESP32相关教程,查看以下内容。

ESP32事物连接指南

介绍ESP32的硬件功能,以及在Arduino使用WiFi/蓝牙芯片系统的入门课程。

无线网络控制机器人

本教程将向您展示如何制作一个机器人,它将网络摄像头传输到一个可远程控制的自定义网站。

Lumini 8x8矩阵连接指南

Lumini 8x8矩阵是可用的最高分辨率LED矩阵。

现场Spotify专辑艺术展示

亚博在线娱乐官网了解如何使用ESP32将我们的64x64 RGB LED矩阵面板变成当前Spotify专辑艺术的显示器。

如果你需要一些项目灵感,亚博官网查看一些以物联网为中心的项目,然后开始制作!亚博官网

光子OLED屏蔽连接指南

光子OLED屏蔽具备为光子项目添加一个小而清晰的OLED屏幕所需的一切。亚博官网本连接指南将向您展示如何开始。

Blynk Board Arduino开发指南

如何用Arduino和Blynk板硬件定义来设置您的计算机——这样您就可以开始创建自己的Blynk项目了!亚博官网

Sparcade:Edison作为浏览器游戏的Web服务器

将英特尔爱迪生变成一个接入点,为基于浏览器的简单游戏提供服务。游戏的高分显示在字符LCD上。

亚博在线娱乐官网学习.spa亚博官网rkfun.comγCC BSA SA 3| 亚博官网Sparkfun电子公司科罗拉多州

透明图形OLED分接连接指南 液体洗涤器 https://www.亚博官网sparkfun.com/users/9562 urn:uuid:442B5E7B-3F6C-4EC6-22B5-237536A007F2 2019年3月7日00:00:00-07:00

透明图形OLED分接连接指南亚博在线娱乐官网learn.亚博官网sparkfun.com教程

可在线访问:http://sfe.io/t612

介绍

未来就在这里!你问了我们送了-我们的QWIIC透明图形OLED分接允许您在透明屏幕上显示自定义图像,使用C或SPI连接。

使用Qwiic连接器,您可以快速(ha ha)并轻松开始使用自己的图像。然而,我们还提供了0.1英寸的插脚,以防您喜欢使用面包板。在黑暗中明亮地照亮,在白天仍然可见,这个OLED的显示区域为128x64像素,其中128x56是完全透明的。OLED的控制基于我们新的超显示库。

亚博官网Sparkfun透明图形OLED突破(QWIIC)

亚博官网Sparkfun透明图形OLED突破(QWIIC)

LCD-15173
39.95美元

驱动这个显示器所需的Arduino草图需要相当多的动态内存,这意味着它不能像atmega328那样安装在较小的控制器上。任何RAM较大的控制器都应该没有问题。在本教程中,我们正在使用ESP32 Thing Plus.

所需材料

要遵循本教程,你需要以下材料。你可能不需要一切,取决于你有什么。把它加入你的购物车,通读指南,并根据需要调整推车。

工具

如果您想使用沿板底部断开的GPIO管脚,你需要在它们上面焊接一些焊头,这样你就需要一个烙铁,焊料,和一般焊接附件.

无铅焊锡-100克线轴

无铅焊锡-100克线轴

TL—09325
7.95美元
WELLER WLC100焊接站

WELLER WLC100焊接站

TL—14228
44.95美元

建议阅读

如果你不熟悉QWIIC系统,我们推荐阅读这里概述一下.

QWIIC连接系统
QWIIC连接系统

如果您不熟悉以下教程,我们还建议您查看它们。

串行通信

异步串行通信概念:数据包,信号电平,波特率,UART和更多!

I2C

I2c简介,目前使用的主要嵌入式通信协议之一。

串行终端基础知识

本教程将向您展示如何使用各种终端仿真器应用程序与串行设备通信。
新!

ESP32 Thing Plus连接指南

在Arduino使用ESP32 Wroom的WiFi/蓝牙系统芯片连接ESP32 Thing Plus指南。
新!

关于超显示你应该知道的一切

这是一个深入介绍SparkFun超显示Arduino库的教程。亚博官网

硬件概述

让我们看看我们正在处理的QWIIC的一些特性,所以我们知道在董事会之外会发生什么。

特性 范围
工作电压 1.65 V-3.3V
供电电流 400毫安
C地址 0x30(默认),0x31

图形显示

图形显示是所有有趣的事情发生的地方。玻璃本身尺寸为42mm x 27.16mm,像素显示屏为35.5 x 18毫米。它包含128x64像素,其中128x56是透明的。

显示屏

图形显示

QWIIC连接器

板上有两个QWIIC连接器,如果您选择这样做,您可以菊花链板。如果你不熟悉我们的QWIIC系统,前往我们的QWICIC页面看看优势!

QWIIC连接器

QWIIC连接器

GPIO管脚

当你看到GPIO管脚时,你会注意到标签从一边到另一边是不同的。一侧标有IC另一侧标有SPI。


C标签 SPI标签

功率发光二极管

这个坏孩子在电路板正确通电后会亮起来。

功率发光二极管

功率发光二极管

您可以通过切断板背面的LED跳线来禁用电源LED。

电源LED跳线

电源LED跳线

JPX跳线

JPX跳线用于改变IC地址或配置板以使用SPI通信。另外两个跳线允许您断开电源指示灯并断开Ic连接多个QWIIC设备时的上拉电阻。

跳跃者 功能
JP1 关闭时保持芯片选择线低。靠近我C开放式SPI
JP2 选择i中的地址C模式。关闭的默认为0x30打开0x31。打开SPI模式以释放D/C销
JP3 用于选择iC或SPI模式。靠近我C开放式SPI
JP4 这个跳线应该为我关上C,打开SPI。此连接允许SDA双向

JP1-JP4

JPX跳线

C上拉跳投

C设备包含明沟,所以我们在我们的电路板上包括电阻,以允许这些设备拉高引脚。如果你有大量的C装置被连接在一起。如果你计划将多个Qwiic板串在一起,你需要剪这个我C上拉跳线.

I2c上拉跳线

C型跳远运动员

硬件连接

现在你知道你的漏板上有什么可用的了,我们可以查看连接到你项目大脑的选项。亚博官网有两个选项可以使用-要么我C或SPI-它们都有各自的优点和缺点。继续阅读,为您的设置选择最佳选项。

C(QWIC)

开始使用透明图形OLED的最简单方法是使用QWIC电缆与QWIIC兼容的微控制器(如ESP32 Thing Plus)您也可以使用QWIIC电路板电缆附加任何Ic型微控制器,或者走风景优美的路线焊料在所有的IC通过电路板上的连接线连接到电镀板上。

QWIC连接器 I2C引脚

所以为什么要用我C?很容易与QWIIC系统连接,您可以在同一个总线上放置两个透明的图形分隔线,而无需再使用任何微控制器插脚。不过,这种简单性是以性能为代价的。i的最大时钟速度C总线为400 kHz,在数据传输中,还有额外的开销来指示哪些字节是数据,哪些是命令。这意味着我C连接最适合显示静态图像。

突破销 微控制器引脚要求
GND 接地引脚。把它们连接起来,使两个装置的电压一致。
3V3 3.3V电源针,可输出高达400 mA
SDA sda-所选I2c端口的双向数据线
SCL SCL-所选I2c端口的时钟线
SA0 可选的:更改断接的I2c地址。确保切割JP2
RST 可选的:通过低脉冲将断接重置为已知状态

SPI

SPI解决了IC速度问题。使用SPI时,有一个指示数据或命令的控制信号,最大时钟速度为10兆赫——使SPI的速度提高50倍!然而,它没有极化QWIIC连接器和低引脚使用的相同便利性。你需要焊料到别针。

SPI引脚

您可以使用SPI连接任意数量的分支。对于n个显示器,您需要使用至少n+3个数据管脚。那是因为摩斯人,SCLKD/C管脚可以在显示器之间共享,但每个分接头都需要自己的专用芯片选择(CS)管脚。

突破销 微控制器引脚要求
反恐精英 一个GPIO引脚,与突破赛交谈时设低
付款交单 一个GPIO引脚,指示字节是数据还是命令
SCLK 所选SPI端口的时钟输出
莫西 所选SPI端口的数据输出
3V3 3.3V电源针,可输出高达400 mA
GND 接地引脚。把它们连接起来,使两个装置的电压一致。

软件设置和编程

注:此示例假定您正在桌面上使用最新版本的Arduino IDE。如果这是你第一次使用Arduino,请回顾我们的教程 安装Arduino IDE。如果您以前没有安装过Arduino库,请查看我们的 安装指南。

驱动程序和板附加组件

取决于您的开发委员会,您可能需要安装驱动程序和板附加组件。对于本教程的范围,我们将使用ESP32 Thing Plus。如果你还没有,确保按照我们的说明安装驱动程序和ESP32 Arduino核心文件。ESP32 Thing Plus连接指南.

安装ESP32板附加文件
ESP32的软件设置

Arduino图书馆

透明图形化OLED分接的软件建立在SparkFun开发的超显示库上。亚博官网如果您不熟悉这个抽象库的工作原理,前往我们的关于超显示你应该知道的一切辅导的。

新!

关于超显示你应该知道的一切

2月20日,二千零一十九

这是一个深入介绍SparkFun超显示Arduino库的教程。亚博官网

Hyperdisplay是一个抽象的库,需要多个层才能正常工作。要使透明图形OLED工作,你需要我们的基地超显示库,这个超显示SSD1309 Arduino库,而这个名字虽然有点痛苦,但很有见地超显示ug2856klbag01 Arduino库.您可以通过Arduino库管理器通过搜索“获取这些库。”超显示库““超显示SSD1309““超显示透明图形OLED“分别。您可以从各自的GitHub页面下载所需的库或下载以下内容*拉链包含所有三个要手动安装的库的文件:

如果手动下载库,解压它们并将所有三个库复制到阿尔杜诺>图书馆文件夹,您机器上的任何位置。

将超显示库复制到Arduino库文件夹

很难看到?单击图像以更近距离查看。

实例

Hyperdisplay_g2856klbag01_Arduinolibrary中包含三个示例,可帮助您开始使用透明图形OLED分组。如果您还没有从上述位置下载库,单击下面的按钮下载库捆绑包。解压并复制到阿尔杜诺>图书馆文件夹。

如果您使用ESP32 Thing Plus Board(与我们一样)跟随本教程,确保将板定义设置为ADAVORY ESP32羽毛.

选择adafruit羽毛板定义

示例1:显示测试

本例的目的是为您的显示充当“Hello World”消息。上载此草图将有助于确认您已正确跟踪硬件连接。草图经过了几个不同的显示测试,从定制的Sparkfun徽标显示开始。亚博官网

要显示徽标,欧文快速地写了一个巨蟒脚本,看了一张JPG图片,然后写了出来,逐像素,用于显示的功能。我们在这里包括了他的剧本和我们的图片——看一看!只要稍加修改,它就可以在您自己的应用程序中发挥作用。

开始,要么选择文件>实例>亚博官网Sparkfun超显示透明图形OLED库>示例1显示测试或者将下面的代码复制并粘贴到新的Arduino窗口中。

语言:c/*验证Qwiic透明Grahical OLED是否正确连接并正常工作。作者:Owen Lyke Sp亚博官网arkfun Electronics日期:2月26日2019年执照:麻省理工学院。有关更多信息,请参阅许可证文件,但基本上可以使用此代码执行任何操作。想支持开源硬件吗?亚博国际官网从Sparkfun买一块木板!亚博官网https://www.亚博官网sparkfun.com/products/15173图形库就像一个三层蛋糕。它们来自自上而下的https://github.com/sparkfun/sparkfun_hy亚博官网perdisplay https://github.com/sparkfun/hyperdisplay_ssd1309_arduinolibrary https://github.com/sparkfun/hyperdisplay_ug2856klbag01_arduinolibrary硬件兼容性-此板上的IO插脚设计用于3.3V,因此如果您使用的是5V微控制器pl轻松使用水平移动器。注:Sparkfun开发板上的Qwiic连接器已经达亚博官网到3.3V-此显示器依赖于微控制器中图形数据的副本,总共1024字节。这是UNO上可用的RAM的一半,因此很容易遇到与内存不足有关的恶意错误。我们建议使用内存更大的micro,比如samd21,ESP32,TENSIY等。硬件连接:选项1(I2c):如果您有QWIIC兼容板,并且计划使用I2c选项2(SPI),则使用QWIIC跳线进行连接:将SCLK和MOSI连接到您选择的SPI端口(UNO-like板上的SPI为13和11),同时将D/C和CS连接到您选择的两个未使用的GPIO引脚(并设置正确的引脚定义为低)不要忘记电源-连接3.3V和GND*/包括“hyperdisplay_g2856klbag01.h”//您的库可以安装在这里:http://librarymanager/all sparkfun_transparent_graphical_oled//层蛋糕的其余部分:http://librarymanager/all sparkfun_hyperdisplay_ssd1309//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////亚博官网///////////////////////////////////////////////////////////////////////////////////////////////////////2/操作可选define cs_pin 4//仅当使用_spi==1 define dc_pin 5/时使用,仅当使用_spi==1 define use_spi 1/选择接口时使用。0=I2C,1=SPI//最终用户设置//对象声明。如果使用SPI ug2856klbag01,则每个接口选项都存在一个类;//声明一个基于SPI的透明OLED对象,名为mytoled else ug2856klbag01_i2c mytoled;//声明一个基于I2c的透明OLED对象,名为mytoled endif/*使用_spi*/void setup()serial.begin(9600);serial.println(f(“example1_displaytest:transparent graphical oled”));if use_spi_port.begin();mytoled.begin(cs_pin,DCPIN,斯皮尔波特);//BEGIN FOR SPI要求您提供CS和DC管脚号ELSE WIRE U PORT.BEGIN();mytoled.begin(接线端口,错误的,ssd1309_-ard-u未使用的_-pin);//begin for i2c具有每个参数线的默认值。setclock(400000);endif/*usse_spi*///不要在内存小的板上显示徽标if!定义(uu avr_atmega328p_uuu)&!defined(uuAvr_Atmega168_uuuu)ShowLogo();//ShowLogo函数是一种不使用
       
        #endif void loop()linetest();延迟(500);矩形();延迟(500);循环();delay(500);void linetest(void)mytoled.clearDisplay();对于(hd_hw_extent_t indi=0;indi<mytoled.xext;indi+=5)mytoled.lineset(0,0,indi,mytoled.yext-1,1);延迟(10);}对于(hd_hw_extent_t indi=0;indi<mytoled.yext;indi+=5)mytoled.lineset(0,mytoled.yext-1,mytoled.xext-1,mytoled.yext-indi-1,1);延迟(10);}对于(hd_hw_extent_t indi=0;indi<mytoled.xext;indi+=5)mytoled.lineset(mytoled.xext-1,mytoled.yext-1,mytoled.xext-indi-1,0,1);延迟(10);}对于(hd_hw_extent_t indi=0;indi<mytoled.yext;indi+=5)mytoled.lineset(mytoled.xext-1,0,0,indi,1);}}void rectest(void)mytoled.clearDisplay();对于(uint8_t indi=0;indi<mytoled.yext/2;indi+=1)mytoled.矩形集(mytoled.xext/2-1-indi,mytoled.yext/2-1-indi,印度mytoled.xext/2+1+indi,mytoled.yext/2+1+indi,假);延迟(50);}对于(uint8_t indi=0;indi<mytoled.yext/2;indi+=1)mytoled.矩形清除(mytoled.xext/2-1-indi,mytoled.yext/2-1-indi,印度mytoled.xext/2+1+indi,mytoled.yext/2+1+indi,假);延迟(50);}对于(uint8_t indi=0;indi<mytoled.yext/2;indi+=1)mytoled.矩形集(mytoled.xext/2-1-indi,mytoled.yext/2-1-indi,印度mytoled.xext/2+1+indi,mytoled.yext/2+1+indi,假);延迟(50);}}void CircleTest(void)mytoled.clearDisplay();对于(uint8_t indi=0;indi<(mytoled.xext/2-1);indi++)mytoled.circleset((mytoled.xext/2-1),(mytoled.yext/2-1),英迪假);延迟(10);}mytoled.circleset((mytoled.xext/2-1),(mytoled.yext/2-1),MytoDel.XExt/2,真的!定义(uu avr_atmega328p_uuu)&!defined(uuavr_atmega168_uuuuuuuvoid showlogo(void)mytoled.setContrastControl(0);mytoled.pixelset(84,3);mytoled.pixelset(85,3);mytoled.pixelset(86,3);mytoled.pixelset(87,3);mytoled.pixelset(88,3);mytoled.pixelset(83,4);mytoled.pixelset(84,4);mytoled.pixelset(85,4);mytoled.pixelset(86,4);mytoled.pixelset(87,4);mytoled.pixelset(82,5);mytoled.pixelset(83,5);mytoled.pixelset(84,5);mytoled.pixelset(85,5);mytoled.pixelset(86,5);mytoled.pixelset(82,6);mytoled.pixelset(83,6);mytoled.pixelset(84,6);mytoled.pixelset(85,6);mytoled.pixelset(86,6);mytoled.pixelset(82,7);mytoled.pixelset(83,7);mytoled.pixelset(84,7);mytoled.pixelset(85,7);mytoled.pixelset(86,7);mytoled.pixelset(82,8);mytoled.pixelset(83,8);mytoled.pixelset(84,8);mytoled.pixelset(85,8);mytoled.pixelset(86,8);mytoled.pixelset(87,8);mytoled.pixelset(92,8);mytoled.pixelset(83,9);mytoled.pixelset(84,9);mytoled.pixelset(85,9);mytoled.pixelset(86,9);mytoled.pixelset(87,9);mytoled.pixelset(88,9);mytoled.pixelset(89,9);mytoled.pixelset(91,9);mytoled.pixelset(92,9);mytoled.pixelset(93,9);mytoled.pixelset(84,10);mytoled.pixelset(85,10);mytoled.pixelset(86,10);mytoled.pixelset(87,10);mytoled.pixelset(88,10);mytoled.pixelset(89,10);mytoled.pixelset(90,10);mytoled.pixelset(91,10);mytoled.pixelset(92,10);mytoled.pixelset(93,10);mytoled.pixelset(85,11);mytoled.pixelset(86,11);mytoled.pixelset(87,11);mytoled.pixelset(88,11);mytoled.pixelset(89,11);mytoled.pixelset(90,11);mytoled.pixelset(91,11);mytoled.pixelset(92,11);mytoled.pixelset(93,11);mytoled.pixelset(78,12);mytoled.pixelset(79,12);mytoled.pixelset(85,12);mytoled.pixelset(86,12);mytoled.pixelset(87,12);mytoled.pixelset(88,12);mytoled.pixelset(89,12);mytoled.pixelset(90,12);mytoled.pixelset(91,12);mytoled.pixelset(92,12);mytoled.pixelset(93,12);mytoled.pixelset(94,12);mytoled.pixelset(77,13);mytoled.pixelset(78,13);mytoled.pixelset(79,13);mytoled.pixelset(85,13);mytoled.pixelset(86,13);mytoled.pixelset(87,13);mytoled.pixelset(88,13);mytoled.pixelset(89,13);mytoled.pixelset(90,13);mytoled.pixelset(91,13);mytoled.pixelset(92,13);mytoled.pixelset(93,13);mytoled.pixelset(94,13);mytoled.pixelset(77,14);mytoled.pixelset(78,14);mytoled.pixelset(79,14);mytoled.pixelset(85,14);mytoled.pixelset(86,14);mytoled.pixelset(87,14);mytoled.pixelset(88,14);mytoled.pixelset(89,14);mytoled.pixelset(90,14);mytoled.pixelset(91,14);mytoled.pixelset(92,14);mytoled.pixelset(93,14);mytoled.pixelset(94,14);mytoled.pixelset(76,15);mytoled.pixelset(77,15);mytoled.pixelset(78,15);mytoled.pixelset(79,15);mytoled.pixelset(80,15);mytoled.pixelset(84,15);mytoled.pixelset(85,15);mytoled.pixelset(86,15);mytoled.pixelset(87,15);mytoled.pixelset(88,15);mytoled.pixelset(89,15);mytoled.pixelset(90,15);mytoled.pixelset(91,15);mytoled.pixelset(92,15);mytoled.pixelset(93,15);mytoled.pixelset(94,15);mytoled.pixelset(76,16);mytoled.pixelset(77,16);mytoled.pixelset(78,16);mytoled.pixelset(79,16);mytoled.pixelset(80,16);mytoled.pixelset(81,16);mytoled.pixelset(82,16);mytoled.pixelset(83,16);mytoled.pixelset(84,16);mytoled.pixelset(85,16);mytoled.pixelset(86,16);mytoled.pixelset(87,16);mytoled.pixelset(88,16);mytoled.pixelset(89,16);mytoled.pixelset(90,16);mytoled.pixelset(91,16);mytoled.pixelset(92,16);mytoled.pixelset(93,16);mytoled.pixelset(94,16);mytoled.pixelset(76,17);mytoled.pixelset(77,17);mytoled.pixelset(78,17);mytoled.pixelset(79,17);mytoled.pixelset(80,17);mytoled.pixelset(81,17);mytoled.pixelset(82,17);mytoled.pixelset(83,17);mytoled.pixelset(84,17);mytoled.pixelset(85,17);mytoled.pixelset(86,17);mytoled.pixelset(87,17);mytoled.pixelset(88,17);mytoled.pixelset(89,17);mytoled.pixelset(90,17);mytoled.pixelset(91,17);mytoled.pixelset(92,17);mytoled.pixelset(93,17);mytoled.pixelset(76,18);mytoled.pixelset(77,18);mytoled.pixelset(78,18);mytoled.pixelset(79,18);mytoled.pixelset(80,18);mytoled.pixelset(81,18);mytoled.pixelset(82,18);mytoled.pixelset(83,18);mytoled.pixelset(84,18);mytoled.pixelset(85,18);mytoled.pixelset(86,18);mytoled.pixelset(87,18);mytoled.pixelset(88,18);mytoled.pixelset(89,18);mytoled.pixelset(90,18);mytoled.pixelset(91,18);mytoled.pixelset(92,18);mytoled.pixelset(93,18);mytoled.pixelset(76,19);mytoled.pixelset(77,19);mytoled.pixelset(78,19);mytoled.pixelset(79,19);mytoled.pixelset(80,19);mytoled.pixelset(81,19);mytoled.pixelset(82,19);mytoled.pixelset(83,19);mytoled.pixelset(84,19);mytoled.pixelset(85,19);mytoled.pixelset(86,19);mytoled.pixelset(87,19);mytoled.pixelset(88,19);mytoled.pixelset(89,19);mytoled.pixelset(90,19);mytoled.pixelset(91,19);mytoled.pixelset(92,19);mytoled.pixelset(76,20);mytoled.pixelset(77,20);mytoled.pixelset(78,20);mytoled.pixelset(79,20);mytoled.pixelset(80,20);mytoled.pixelset(81,20);mytoled.pixelset(82,20);mytoled.pixelset(83,20);mytoled.pixelset(84,20);mytoled.pixelset(85,20);mytoled.pixelset(86,20);mytoled.pixelset(87,20);mytoled.pixelset(88,20);mytoled.pixelset(89,20);mytoled.pixelset(90,20);mytoled.pixelset(91,20);mytoled.pixelset(92,20);mytoled.pixelset(76,21);mytoled.pixelset(77,21);mytoled.pixelset(78,21);mytoled.pixelset(79,21);mytoled.pixelset(80,21);mytoled.pixelset(81,21);mytoled.pixelset(82,21);mytoled.pixelset(83,21);mytoled.pixelset(84,21);mytoled.pixelset(85,21);mytoled.pixelset(86,21);mytoled.pixelset(87,21);mytoled.pixelset(88,21);mytoled.pixelset(89,21);mytoled.pixelset(90,21);mytoled.pixelset(91,21);mytoled.pixelset(76,22);mytoled.pixelset(77,22);mytoled.pixelset(78,22);mytoled.pixelset(79,22);mytoled.pixelset(80,22);mytoled.pixelset(81,22);mytoled.pixelset(82,22);mytoled.pixelset(83,22);mytoled.pixelset(84,22);mytoled.pixelset(85,22);mytoled.pixelset(86,22);mytoled.pixelset(87,22);mytoled.pixelset(88,22);mytoled.pixelset(89,22);mytoled.pixelset(76,23);mytoled.pixelset(77,23);mytoled.pixelset(78,23);mytoled.pixelset(79,23);mytoled.pixelset(80,23);mytoled.pixelset(81,23);mytoled.pixelset(82,23);mytoled.pixelset(83,23);mytoled.pixelset(84,23);mytoled.pixelset(85,23);mytoled.pixelset(86,23);mytoled.pixelset(87,23);mytoled.pixelset(76,24);mytoled.pixelset(77,24);mytoled.pixelset(78,24);mytoled.pixelset(79,24);mytoled.pixelset(80,24);mytoled.pixelset(81,24);mytoled.pixelset(76,25);mytoled.pixelset(77,25);mytoled.pixelset(78,25);mytoled.pixelset(79,25);mytoled.pixelset(80,25);mytoled.pixelset(76,26);mytoled.pixelset(77,26);mytoled.pixelset(78,26);mytoled.pixelset(79,26);mytoled.pixelset(76,27);mytoled.pixelset(77,27);mytoled.pixelset(78,27);mytoled.pixelset(76,28);mytoled.pixelset(77,28);mytoled.pixelset(76,29);mytoled.pixelset(88,29);mytoled.pixelset(89,29);mytoled.pixelset(90,29);mytoled.pixelset(91,29);mytoled.pixelset(92,29);mytoled.pixelset(69,30);mytoled.pixelset(70,30);mytoled.pixelset(76,30);mytoled.pixelset(87,30);mytoled.pixelset(88,30);mytoled.pixelset(89,30);mytoled.pixelset(90,30);mytoled.pixelset(91,30);mytoled.pixelset(92,30);mytoled.pixelset(67,31);mytoled.pixelset(68,31);mytoled.pixelset(69,31);mytoled.pixelset(70,31);mytoled.pixelset(86,31);mytoled.pixelset(87,31);mytoled.pixelset(88,31);mytoled.pixelset(89,31);mytoled.pixelset(90,31);mytoled.pixelset(91,31);mytoled.pixelset(92,31);mytoled.pixelset(67,32);mytoled.pixelset(68,32);mytoled.pixelset(69,32);mytoled.pixelset(70,32);mytoled.pixelset(86,32);mytoled.pixelset(87,32);mytoled.pixelset(88,32);mytoled.pixelset(89,32);mytoled.pixelset(67,33);mytoled.pixelset(68,33);mytoled.pixelset(69,33);mytoled.pixelset(70,33);mytoled.pixelset(86,33);mytoled.pixelset(87,33);mytoled.pixelset(88,33);mytoled.pixelset(67,34);mytoled.pixelset(68,34);mytoled.pixelset(69,34);mytoled.pixelset(70,34);mytoled.pixelset(86,34);mytoled.pixelset(87,34);mytoled.pixelset(88,34);mytoled.pixelset(6,35);mytoled.pixelset(7,35);mytoled.pixelset(8,35);mytoled.pixelset(9,35);mytoled.pixelset(10,35);mytoled.pixelset(11,35);mytoled.pixelset(12,35);mytoled.pixelset(13,35);mytoled.pixelset(22,35);mytoled.pixelset(26,35);mytoled.pixelset(27,35);mytoled.pixelset(28,35);mytoled.pixelset(29,35);mytoled.pixelset(30,35);mytoled.pixelset(31,35);mytoled.pixelset(41,35);mytoled.pixelset(42,35);mytoled.pixelset(43,35);mytoled.pixelset(44,35);mytoled.pixelset(45,35);mytoled.pixelset(46,35);mytoled.pixelset(47,35);mytoled.pixelset(48,35);mytoled.pixelset(61,35);mytoled.pixelset(62,35);mytoled.pixelset(63,35);mytoled.pixelset(64,35);mytoled.pixelset(67,35);mytoled.pixelset(68,35);mytoled.pixelset(69,35);mytoled.pixelset(70,35);mytoled.pixelset(77,35);mytoled.pixelset(78,35);mytoled.pixelset(79,35);mytoled.pixelset(80,35);mytoled.pixelset(84,35);mytoled.pixelset(85,35);mytoled.pixelset(86,35);mytoled.pixelset(87,35);mytoled.pixelset(88,35);mytoled.pixelset(89,35);mytoled.pixelset(90,35);mytoled.pixelset(91,35);mytoled.pixelset(92,35);mytoled.pixelset(94,35);mytoled.pixelset(95,35);mytoled.pixelset(96,35);mytoled.pixelset(97,35);mytoled.pixelset(105,35);mytoled.pixelset(106,35);mytoled.pixelset(107,35);mytoled.pixelset(108,35);mytoled.pixelset(112,35);mytoled.pixelset(113,35);mytoled.pixelset(114,35);mytoled.pixelset(118,35);mytoled.pixelset(119,35);mytoled.pixelset(120,35);mytoled.pixelset(121,35);mytoled.pixelset(122,35);mytoled.pixelset(123,35);mytoled.pixelset(5,36);mytoled.pixelset(6,36);mytoled.pixelset(7,36);mytoled.pixelset(8,36);mytoled.pixelset(9,36);mytoled.pixelset(10,36);mytoled.pixelset(11,36);mytoled.pixelset(12,36);mytoled.pixelset(13,36);mytoled.pixelset(14,36);mytoled.pixelset(20,36);mytoled.pixelset(21,36);mytoled.pixelset(22,36);mytoled.pixelset(24,36);mytoled.pixelset(25,36);mytoled.pixelset(26,36);mytoled.pixelset(27,36);mytoled.pixelset(28,36);mytoled.pixelset(29,36);mytoled.pixelset(30,36);mytoled.pixelset(31,36);mytoled.pixelset(32,36);mytoled.pixelset(39,36);mytoled.pixelset(40,36);mytoled.pixelset(41,36);mytoled.pixelset(42,36);mytoled.pixelset(43,36);mytoled.pixelset(44,36);mytoled.pixelset(45,36);mytoled.pixelset(46,36);mytoled.pixelset(47,36);mytoled.pixelset(48,36);mytoled.pixelset(49,36);mytoled.pixelset(50,36);mytoled.pixelset(55,36);mytoled.pixelset(56,36);mytoled.pixelset(57,36);mytoled.pixelset(58,36);mytoled.pixelset(60,36);mytoled.pixelset(61,36);mytoled.pixelset(62,36);mytoled.pixelset(63,36);mytoled.pixelset(64,36);mytoled.pixelset(67,36);mytoled.pixelset(68,36);mytoled.pixelset(69,36);mytoled.pixelset(70,36);mytoled.pixelset(76,36);mytoled.pixelset(77,36);mytoled.pixelset(78,36);mytoled.pixelset(79,36);mytoled.pixelset(83,36);mytoled.pixelset(84,36);mytoled.pixelset(85,36);mytoled.pixelset(86,36);mytoled.pixelset(87,36);mytoled.pixelset(88,36);mytoled.pixelset(89,36);mytoled.pixelset(90,36);mytoled.pixelset(91,36);mytoled.pixelset(92,36);mytoled.pixelset(94,36);mytoled.pixelset(95,36);mytoled.pixelset(96,36);mytoled.pixelset(97,36);mytoled.pixelset(105,36);mytoled.pixelset(106,36);mytoled.pixelset(107,36);mytoled.pixelset(108,36);mytoled.pixelset(112,36);mytoled.pixelset(113,36);mytoled.pixelset(114,36);mytoled.pixelset(117,36);mytoled.pixelset(118,36);mytoled.pixelset(119,36);mytoled.pixelset(120,36);mytoled.pixelset(121,36);mytoled.pixelset(122,36);mytoled.pixelset(123,36);mytoled.pixelset(124,36);mytoled.pixelset(4,37);mytoled.pixelset(5,37);mytoled.pixelset(6,37);mytoled.pixelset(7,37);mytoled.pixelset(12,37);mytoled.pixelset(13,37);mytoled.pixelset(14,37);mytoled.pixelset(15,37);mytoled.pixelset(20,37);mytoled.pixelset(21,37);mytoled.pixelset(22,37);mytoled.pixelset(23,37);mytoled.pixelset(24,37);mytoled.pixelset(25,37);mytoled.pixelset(26,37);mytoled.pixelset(27,37);mytoled.pixelset(28,37);mytoled.pixelset(29,37);mytoled.pixelset(30,37);mytoled.pixelset(31,37);mytoled.pixelset(32,37);mytoled.pixelset(33,37);mytoled.pixelset(38,37);mytoled.pixelset(39,37);mytoled.pixelset(40,37);mytoled.pixelset(41,37);mytoled.pixelset(42,37);mytoled.pixelset(47,37);mytoled.pixelset(48,37);mytoled.pixelset(49,37);mytoled.pixelset(50,37);mytoled.pixelset(51,37);mytoled.pixelset(55,37);mytoled.pixelset(56,37);mytoled.pixelset(57,37);mytoled.pixelset(58,37);mytoled.pixelset(59,37);mytoled.pixelset(60,37);mytoled.pixelset(61,37);mytoled.pixelset(62,37);mytoled.pixelset(63,37);mytoled.pixelset(64,37);mytoled.pixelset(67,37);mytoled.pixelset(68,37);mytoled.pixelset(69,37);mytoled.pixelset(70,37);mytoled.pixelset(75,37);mytoled.pixelset(76,37);mytoled.pixelset(77,37);mytoled.pixelset(78,37);mytoled.pixelset(82,37);mytoled.pixelset(83,37);mytoled.pixelset(84,37);mytoled.pixelset(85,37);mytoled.pixelset(86,37);mytoled.pixelset(87,37);mytoled.pixelset(88,37);mytoled.pixelset(89,37);mytoled.pixelset(90,37);mytoled.pixelset(91,37);mytoled.pixelset(92,37);mytoled.pixelset(94,37);mytoled.pixelset(95,37);mytoled.pixelset(96,37);mytoled.pixelset(97,37);mytoled.pixelset(105,37);mytoled.pixelset(106,37);mytoled.pixelset(107,37);mytoled.pixelset(108,37);mytoled.pixelset(112,37);mytoled.pixelset(113,37);mytoled.pixelset(114,37);mytoled.pixelset(115,37);mytoled.pixelset(116,37);mytoled.pixelset(117,37);mytoled.pixelset(118,37);mytoled.pixelset(119,37);mytoled.pixelset(120,37);mytoled.pixelset(121,37);mytoled.pixelset(122,37);mytoled.pixelset(123,37);mytoled.pixelset(124,37);mytoled.pixelset(125,37);mytoled.pixelset(3,38);mytoled.pixelset(4,38);mytoled.pixelset(5,38);mytoled.pixelset(6,38);mytoled.pixelset(13,38);mytoled.pixelset(14,38);mytoled.pixelset(15,38);mytoled.pixelset(16,38);mytoled.pixelset(20,38);mytoled.pixelset(21,38);mytoled.pixelset(22,38);mytoled.pixelset(23,38);mytoled.pixelset(24,38);mytoled.pixelset(30,38);mytoled.pixelset(31,38);mytoled.pixelset(32,38);mytoled.pixelset(33,38);mytoled.pixelset(38,38);mytoled.pixelset(39,38);mytoled.pixelset(40,38);mytoled.pixelset(41,38);mytoled.pixelset(48,38);mytoled.pixelset(49,38);mytoled.pixelset(50,38);mytoled.pixelset(51,38);mytoled.pixelset(55,38);mytoled.pixelset(56,38);mytoled.pixelset(57,38);mytoled.pixelset(58,38);mytoled.pixelset(59,38);mytoled.pixelset(60,38);mytoled.pixelset(61,38);mytoled.pixelset(64,38);mytoled.pixelset(67,38);mytoled.pixelset(68,38);mytoled.pixelset(69,38);mytoled.pixelset(70,38);mytoled.pixelset(74,38);mytoled.pixelset(75,38);mytoled.pixelset(76,38);mytoled.pixelset(77,38);mytoled.pixelset(86,38);mytoled.pixelset(87,38);mytoled.pixelset(88,38);mytoled.pixelset(94,38);mytoled.pixelset(95,38);mytoled.pixelset(96,38);mytoled.pixelset(97,38);mytoled.pixelset(105,38);mytoled.pixelset(106,38);mytoled.pixelset(107,38);mytoled.pixelset(108,38);mytoled.pixelset(112,38);mytoled.pixelset(113,38);mytoled.pixelset(114,38);mytoled.pixelset(115,38);mytoled.pixelset(116,38);mytoled.pixelset(121,38);mytoled.pixelset(122,38);mytoled.pixelset(123,38);mytoled.pixelset(124,38);mytoled.pixelset(125,38);mytoled.pixelset(3,39);mytoled.pixelset(4,39);mytoled.pixelset(5,39);mytoled.pixelset(6,39);mytoled.pixelset(20,39);mytoled.pixelset(21,39);mytoled.pixelset(22,39);mytoled.pixelset(23,39);mytoled.pixelset(31,39);mytoled.pixelset(32,39);mytoled.pixelset(33,39);mytoled.pixelset(34,39);mytoled.pixelset(38,39);mytoled.pixelset(39,39);mytoled.pixelset(40,39);mytoled.pixelset(41,39);mytoled.pixelset(48,39);mytoled.pixelset(49,39);mytoled.pixelset(50,39);mytoled.pixelset(51,39);mytoled.pixelset(55,39);mytoled.pixelset(56,39);mytoled.pixelset(57,39);mytoled.pixelset(58,39);mytoled.pixelset(59,39);mytoled.pixelset(67,39);mytoled.pixelset(68,39);mytoled.pixelset(69,39);mytoled.pixelset(70,39);mytoled.pixelset(73,39);mytoled.pixelset(74,39);mytoled.pixelset(75,39);mytoled.pixelset(76,39);mytoled.pixelset(86,39);mytoled.pixelset(87,39);mytoled.pixelset(88,39);mytoled.pixelset(94,39);mytoled.pixelset(95,39);mytoled.pixelset(96,39);mytoled.pixelset(97,39);mytoled.pixelset(105,39);mytoled.pixelset(106,39);mytoled.pixelset(107,39);mytoled.pixelset(108,39);mytoled.pixelset(112,39);mytoled.pixelset(113,39);mytoled.pixelset(114,39);mytoled.pixelset(115,39);mytoled.pixelset(122,39);mytoled.pixelset(123,39);mytoled.pixelset(124,39);mytoled.pixelset(125,39);mytoled.pixelset(3,40);mytoled.pixelset(4,40);mytoled.pixelset(5,40);mytoled.pixelset(6,40);mytoled.pixelset(7,40);mytoled.pixelset(20,40);mytoled.pixelset(21,40);mytoled.pixelset(22,40);mytoled.pixelset(23,40);mytoled.pixelset(31,40);mytoled.pixelset(32,40);mytoled.pixelset(33,40);mytoled.pixelset(34,40);mytoled.pixelset(48,40);mytoled.pixelset(49,40);mytoled.pixelset(50,40);mytoled.pixelset(51,40);mytoled.pixelset(55,40);mytoled.pixelset(56,40);mytoled.pixelset(57,40);mytoled.pixelset(58,40);mytoled.pixelset(59,40);mytoled.pixelset(67,40);mytoled.pixelset(68,40);mytoled.pixelset(69,40);mytoled.pixelset(70,40);mytoled.pixelset(72,40);mytoled.pixelset(73,40);mytoled.pixelset(74,40);mytoled.pixelset(75,40);mytoled.pixelset(86,40);mytoled.pixelset(87,40);mytoled.pixelset(88,40);mytoled.pixelset(94,40);mytoled.pixelset(95,40);mytoled.pixelset(96,40);mytoled.pixelset(97,40);mytoled.pixelset(105,40);mytoled.pixelset(106,40);mytoled.pixelset(107,40);mytoled.pixelset(108,40);mytoled.pixelset(112,40);mytoled.pixelset(113,40);mytoled.pixelset(114,40);mytoled.pixelset(115,40);mytoled.pixelset(122,40);mytoled.pixelset(123,40);mytoled.pixelset(124,40);mytoled.pixelset(125,40);mytoled.pixelset(4,41);mytoled.pixelset(5,41);mytoled.pixelset(6,41);mytoled.pixelset(7,41);mytoled.pixelset(8,41);mytoled.pixelset(9,41);mytoled.pixelset(10,41);mytoled.pixelset(11,41);mytoled.pixelset(20,41);mytoled.pixelset(21,41);mytoled.pixelset(22,41);mytoled.pixelset(31,41);mytoled.pixelset(32,41);mytoled.pixelset(33,41);mytoled.pixelset(34,41);mytoled.pixelset(46,41);mytoled.pixelset(47,41);mytoled.pixelset(48,41);mytoled.pixelset(49,41);mytoled.pixelset(50,41);mytoled.pixelset(51,41);mytoled.pixelset(55,41);mytoled.pixelset(56,41);mytoled.pixelset(57,41);mytoled.pixelset(58,41);mytoled.pixelset(67,41);mytoled.pixelset(68,41);mytoled.pixelset(69,41);mytoled.pixelset(70,41);mytoled.pixelset(71,41);mytoled.pixelset(72,41);mytoled.pixelset(73,41);mytoled.pixelset(74,41);mytoled.pixelset(75,41);mytoled.pixelset(86,41);mytoled.pixelset(87,41);mytoled.pixelset(88,41);mytoled.pixelset(94,41);mytoled.pixelset(95,41);mytoled.pixelset(96,41);mytoled.pixelset(97,41);mytoled.pixelset(105,41);mytoled.pixelset(106,41);mytoled.pixelset(107,41);mytoled.pixelset(108,41);mytoled.pixelset(112,41);mytoled.pixelset(113,41);mytoled.pixelset(114,41);mytoled.pixelset(115,41);mytoled.pixelset(122,41);mytoled.pixelset(123,41);mytoled.pixelset(124,41);mytoled.pixelset(125,41);mytoled.pixelset(5,42);mytoled.pixelset(6,42);mytoled.pixelset(7,42);mytoled.pixelset(8,42);mytoled.pixelset(9,42);mytoled.pixelset(10,42);mytoled.pixelset(11,42);mytoled.pixelset(12,42);mytoled.pixelset(13,42);mytoled.pixelset(14,42);mytoled.pixelset(20,42);mytoled.pixelset(21,42);mytoled.pixelset(22,42);mytoled.pixelset(32,42);mytoled.pixelset(33,42);mytoled.pixelset(34,42);mytoled.pixelset(41,42);mytoled.pixelset(42,42);mytoled.pixelset(43,42);mytoled.pixelset(44,42);mytoled.pixelset(45,42);mytoled.pixelset(46,42);mytoled.pixelset(47,42);mytoled.pixelset(48,42);mytoled.pixelset(49,42);mytoled.pixelset(50,42);mytoled.pixelset(51,42);mytoled.pixelset(55,42);mytoled.pixelset(56,42);mytoled.pixelset(57,42);mytoled.pixelset(58,42);mytoled.pixelset(67,42);mytoled.pixelset(68,42);mytoled.pixelset(69,42);mytoled.pixelset(70,42);mytoled.pixelset(71,42);mytoled.pixelset(72,42);mytoled.pixelset(73,42);mytoled.pixelset(74,42);mytoled.pixelset(75,42);mytoled.pixelset(76,42);mytoled.pixelset(86,42);mytoled.pixelset(87,42);mytoled.pixelset(88,42);mytoled.pixelset(94,42);mytoled.pixelset(95,42);mytoled.pixelset(96,42);mytoled.pixelset(97,42);mytoled.pixelset(105,42);mytoled.pixelset(106,42);mytoled.pixelset(107,42);mytoled.pixelset(108,42);mytoled.pixelset(112,42);mytoled.pixelset(113,42);mytoled.pixelset(114,42);mytoled.pixelset(115,42);mytoled.pixelset(122,42);mytoled.pixelset(123,42);mytoled.pixelset(124,42);mytoled.pixelset(125,42);mytoled.pixelset(7,43);mytoled.pixelset(8,43);mytoled.pixelset(9,43);mytoled.pixelset(10,43);mytoled.pixelset(11,43);mytoled.pixelset(12,43);mytoled.pixelset(13,43);mytoled.pixelset(14,43);mytoled.pixelset(15,43);mytoled.pixelset(20,43);mytoled.pixelset(21,43);mytoled.pixelset(22,43);mytoled.pixelset(32,43);mytoled.pixelset(33,43);mytoled.pixelset(34,43);mytoled.pixelset(39,43);mytoled.pixelset(40,43);mytoled.pixelset(41,43);mytoled.pixelset(42,43);mytoled.pixelset(43,43);mytoled.pixelset(44,43);mytoled.pixelset(45,43);mytoled.pixelset(48,43);mytoled.pixelset(49,43);mytoled.pixelset(50,43);mytoled.pixelset(51,43);mytoled.pixelset(55,43);mytoled.pixelset(56,43);mytoled.pixelset(57,43);mytoled.pixelset(58,43);mytoled.pixelset(67,43);mytoled.pixelset(68,43);mytoled.pixelset(69,43);mytoled.pixelset(70,43);mytoled.pixelset(71,43);mytoled.pixelset(72,43);mytoled.pixelset(73,43);mytoled.pixelset(74,43);mytoled.pixelset(75,43);mytoled.pixelset(76,43);mytoled.pixelset(86,43);mytoled.pixelset(87,43);mytoled.pixelset(88,43);mytoled.pixelset(94,43);mytoled.pixelset(95,43);mytoled.pixelset(96,43);mytoled.pixelset(97,43);mytoled.pixelset(105,43);mytoled.pixelset(106,43);mytoled.pixelset(107,43);mytoled.pixelset(108,43);mytoled.pixelset(112,43);mytoled.pixelset(113,43);mytoled.pixelset(114,43);mytoled.pixelset(115,43);mytoled.pixelset(122,43);mytoled.pixelset(123,43);mytoled.pixelset(124,43);mytoled.pixelset(125,43);mytoled.pixelset(11,44);mytoled.pixelset(12,44);mytoled.pixelset(13,44);mytoled.pixelset(14,44);mytoled.pixelset(15,44);mytoled.pixelset(16,44);mytoled.pixelset(20,44);mytoled.pixelset(21,44);mytoled.pixelset(22,44);mytoled.pixelset(31,44);mytoled.pixelset(32,44);mytoled.pixelset(33,44);mytoled.pixelset(34,44);mytoled.pixelset(38,44);mytoled.pixelset(39,44);mytoled.pixelset(40,44);mytoled.pixelset(41,44);mytoled.pixelset(48,44);mytoled.pixelset(49,44);mytoled.pixelset(50,44);mytoled.pixelset(51,44);mytoled.pixelset(55,44);mytoled.pixelset(56,44);mytoled.pixelset(57,44);mytoled.pixelset(58,44);mytoled.pixelset(67,44);mytoled.pixelset(68,44);mytoled.pixelset(69,44);mytoled.pixelset(70,44);mytoled.pixelset(71,44);mytoled.pixelset(73,44);mytoled.pixelset(74,44);mytoled.pixelset(75,44);mytoled.pixelset(76,44);mytoled.pixelset(77,44);mytoled.pixelset(86,44);mytoled.pixelset(87,44);mytoled.pixelset(88,44);mytoled.pixelset(94,44);mytoled.pixelset(95,44);mytoled.pixelset(96,44);mytoled.pixelset(97,44);mytoled.pixelset(105,44);mytoled.pixelset(106,44);mytoled.pixelset(107,44);mytoled.pixelset(108,44);mytoled.pixelset(112,44);mytoled.pixelset(113,44);mytoled.pixelset(114,44);mytoled.pixelset(115,44);mytoled.pixelset(122,44);mytoled.pixelset(123,44);mytoled.pixelset(124,44);mytoled.pixelset(125,44);mytoled.pixelset(13,45);mytoled.pixelset(14,45);mytoled.pixelset(15,45);mytoled.pixelset(16,45);mytoled.pixelset(20,45);mytoled.pixelset(21,45);mytoled.pixelset(22,45);mytoled.pixelset(23,45);mytoled.pixelset(31,45);mytoled.pixelset(32,45);mytoled.pixelset(33,45);mytoled.pixelset(34,45);mytoled.pixelset(37,45);mytoled.pixelset(38,45);mytoled.pixelset(39,45);mytoled.pixelset(40,45);mytoled.pixelset(48,45);mytoled.pixelset(49,45);mytoled.pixelset(50,45);mytoled.pixelset(51,45);mytoled.pixelset(55,45);mytoled.pixelset(56,45);mytoled.pixelset(57,45);mytoled.pixelset(58,45);mytoled.pixelset(67,45);mytoled.pixelset(68,45);mytoled.pixelset(69,45);mytoled.pixelset(70,45);mytoled.pixelset(74,45);mytoled.pixelset(75,45);mytoled.pixelset(76,45);mytoled.pixelset(77,45);mytoled.pixelset(78,45);mytoled.pixelset(86,45);mytoled.pixelset(87,45);mytoled.pixelset(88,45);mytoled.pixelset(94,45);mytoled.pixelset(95,45);mytoled.pixelset(96,45);mytoled.pixelset(97,45);mytoled.pixelset(105,45);mytoled.pixelset(106,45);mytoled.pixelset(107,45);mytoled.pixelset(108,45);mytoled.pixelset(112,45);mytoled.pixelset(113,45);mytoled.pixelset(114,45);mytoled.pixelset(115,45);mytoled.pixelset(122,45);mytoled.pixelset(123,45);mytoled.pixelset(124,45);mytoled.pixelset(125,45);mytoled.pixelset(3,46);mytoled.pixelset(4,46);mytoled.pixelset(5,46);mytoled.pixelset(6,46);mytoled.pixelset(13,46);mytoled.pixelset(14,46);mytoled.pixelset(15,46);mytoled.pixelset(16,46);mytoled.pixelset(20,46);mytoled.pixelset(21,46);mytoled.pixelset(22,46);mytoled.pixelset(23,46);mytoled.pixelset(31,46);mytoled.pixelset(32,46);mytoled.pixelset(33,46);mytoled.pixelset(34,46);mytoled.pixelset(37,46);mytoled.pixelset(38,46);mytoled.pixelset(39,46);mytoled.pixelset(40,46);mytoled.pixelset(48,46);mytoled.pixelset(49,46);mytoled.pixelset(50,46);mytoled.pixelset(51,46);mytoled.pixelset(55,46);mytoled.pixelset(56,46);mytoled.pixelset(57,46);mytoled.pixelset(58,46);mytoled.pixelset(67,46);mytoled.pixelset(68,46);mytoled.pixelset(69,46);mytoled.pixelset(70,46);mytoled.pixelset(75,46);mytoled.pixelset(76,46);mytoled.pixelset(77,46);mytoled.pixelset(78,46);mytoled.pixelset(86,46);mytoled.pixelset(87,46);mytoled.pixelset(88,46);mytoled.pixelset(94,46);mytoled.pixelset(95,46);mytoled.pixelset(96,46);mytoled.pixelset(97,46);mytoled.pixelset(98,46);mytoled.pixelset(104,46);mytoled.pixelset(105,46);mytoled.pixelset(106,46);mytoled.pixelset(107,46);mytoled.pixelset(108,46);mytoled.pixelset(112,46);mytoled.pixelset(113,46);mytoled.pixelset(114,46);mytoled.pixelset(115,46);mytoled.pixelset(122,46);mytoled.pixelset(123,46);mytoled.pixelset(124,46);mytoled.pixelset(125,46);mytoled.pixelset(3,47);mytoled.pixelset(4,47);mytoled.pixelset(5,47);mytoled.pixelset(6,47);mytoled.pixelset(13,47);mytoled.pixelset(14,47);mytoled.pixelset(15,47);mytoled.pixelset(16,47);mytoled.pixelset(20,47);mytoled.pixelset(21,47);mytoled.pixelset(22,47);mytoled.pixelset(23,47);mytoled.pixelset(24,47);mytoled.pixelset(30,47);mytoled.pixelset(31,47);mytoled.pixelset(32,47);mytoled.pixelset(33,47);mytoled.pixelset(34,47);mytoled.pixelset(37,47);mytoled.pixelset(38,47);mytoled.pixelset(39,47);mytoled.pixelset(40,47);mytoled.pixelset(47,47);mytoled.pixelset(48,47);mytoled.pixelset(49,47);mytoled.pixelset(50,47);mytoled.pixelset(51,47);mytoled.pixelset(55,47);mytoled.pixelset(56,47);mytoled.pixelset(57,47);mytoled.pixelset(58,47);mytoled.pixelset(67,47);mytoled.pixelset(68,47);mytoled.pixelset(69,47);mytoled.pixelset(70,47);mytoled.pixelset(75,47);mytoled.pixelset(76,47);mytoled.pixelset(77,47);mytoled.pixelset(78,47);mytoled.pixelset(79,47);mytoled.pixelset(86,47);mytoled.pixelset(87,47);mytoled.pixelset(88,47);mytoled.pixelset(95,47);mytoled.pixelset(96,47);mytoled.pixelset(97,47);mytoled.pixelset(98,47);mytoled.pixelset(104,47);mytoled.pixelset(105,47);mytoled.pixelset(106,47);mytoled.pixelset(107,47);mytoled.pixelset(108,47);mytoled.pixelset(112,47);mytoled.pixelset(113,47);mytoled.pixelset(114,47);mytoled.pixelset(115,47);mytoled.pixelset(122,47);mytoled.pixelset(123,47);mytoled.pixelset(124,47);mytoled.pixelset(125,47);mytoled.pixelset(4,48);mytoled.pixelset(5,48);mytoled.pixelset(6,48);mytoled.pixelset(7,48);mytoled.pixelset(12,48);mytoled.pixelset(13,48);mytoled.pixelset(14,48);mytoled.pixelset(15,48);mytoled.pixelset(16,48);mytoled.pixelset(20,48);mytoled.pixelset(21,48);mytoled.pixelset(22,48);mytoled.pixelset(23,48);mytoled.pixelset(24,48);mytoled.pixelset(25,48);mytoled.pixelset(26,48);mytoled.pixelset(27,48);mytoled.pixelset(28,48);mytoled.pixelset(29,48);mytoled.pixelset(30,48);mytoled.pixelset(31,48);mytoled.pixelset(32,48);mytoled.pixelset(33,48);mytoled.pixelset(38,48);mytoled.pixelset(39,48);mytoled.pixelset(40,48);mytoled.pixelset(41,48);mytoled.pixelset(46,48);mytoled.pixelset(47,48);mytoled.pixelset(48,48);mytoled.pixelset(49,48);mytoled.pixelset(50,48);mytoled.pixelset(51,48);mytoled.pixelset(55,48);mytoled.pixelset(56,48);mytoled.pixelset(57,48);mytoled.pixelset(58,48);mytoled.pixelset(67,48);mytoled.pixelset(68,48);mytoled.pixelset(69,48);mytoled.pixelset(70,48);mytoled.pixelset(76,48);mytoled.pixelset(77,48);mytoled.pixelset(78,48);mytoled.pixelset(79,48);mytoled.pixelset(80,48);mytoled.pixelset(86,48);mytoled.pixelset(87,48);mytoled.pixelset(88,48);mytoled.pixelset(95,48);mytoled.pixelset(96,48);mytoled.pixelset(97,48);mytoled.pixelset(98,48);mytoled.pixelset(99,48);mytoled.pixelset(100,48);mytoled.pixelset(101,48);mytoled.pixelset(102,48);mytoled.pixelset(103,48);mytoled.pixelset(104,48);mytoled.pixelset(105,48);mytoled.pixelset(106,48);mytoled.pixelset(107,48);mytoled.pixelset(108,48);mytoled.pixelset(112,48);mytoled.pixelset(113,48);mytoled.pixelset(114,48);mytoled.pixelset(115,48);mytoled.pixelset(122,48);mytoled.pixelset(123,48);mytoled.pixelset(124,48);mytoled.pixelset(125,48);mytoled.pixelset(4,49);mytoled.pixelset(5,49);mytoled.pixelset(6,49);mytoled.pixelset(7,49);mytoled.pixelset(8,49);mytoled.pixelset(9,49);mytoled.pixelset(10,49);mytoled.pixelset(11,49);mytoled.pixelset(12,49);mytoled.pixelset(13,49);mytoled.pixelset(14,49);mytoled.pixelset(15,49);mytoled.pixelset(20,49);mytoled.pixelset(21,49);mytoled.pixelset(22,49);mytoled.pixelset(23,49);mytoled.pixelset(24,49);mytoled.pixelset(25,49);mytoled.pixelset(26,49);mytoled.pixelset(27,49);mytoled.pixelset(28,49);mytoled.pixelset(29,49);mytoled.pixelset(30,49);mytoled.pixelset(31,49);mytoled.pixelset(32,49);mytoled.pixelset(38,49);mytoled.pixelset(39,49);mytoled.pixelset(40,49);mytoled.pixelset(41,49);mytoled.pixelset(42,49);mytoled.pixelset(43,49);mytoled.pixelset(44,49);mytoled.pixelset(45,49);mytoled.pixelset(46,49);mytoled.pixelset(47,49);mytoled.pixelset(48,49);mytoled.pixelset(49,49);mytoled.pixelset(50,49);mytoled.pixelset(51,49);mytoled.pixelset(55,49);mytoled.pixelset(56,49);mytoled.pixelset(57,49);mytoled.pixelset(58,49);mytoled.pixelset(67,49);mytoled.pixelset(68,49);mytoled.pixelset(69,49);mytoled.pixelset(70,49);mytoled.pixelset(77,49);mytoled.pixelset(78,49);mytoled.pixelset(79,49);mytoled.pixelset(80,49);mytoled.pixelset(86,49);mytoled.pixelset(87,49);mytoled.pixelset(88,49);mytoled.pixelset(95,49);mytoled.pixelset(96,49);mytoled.pixelset(97,49);mytoled.pixelset(98,49);mytoled.pixelset(99,49);mytoled.pixelset(100,49);mytoled.pixelset(101,49);mytoled.pixelset(102,49);mytoled.pixelset(103,49);mytoled.pixelset(105,49);mytoled.pixelset(106,49);mytoled.pixelset(107,49);mytoled.pixelset(108,49);mytoled.pixelset(112,49);mytoled.pixelset(113,49);mytoled.pixelset(114,49);mytoled.pixelset(115,49);mytoled.pixelset(122,49);mytoled.pixelset(123,49);mytoled.pixelset(124,49);mytoled.pixelset(125,49);mytoled.pixelset(6,50);mytoled.pixelset(7,50);mytoled.pixelset(8,50);mytoled.pixelset(9,50);mytoled.pixelset(10,50);mytoled.pixelset(11,50);mytoled.pixelset(12,50);mytoled.pixelset(13,50);mytoled.pixelset(20,50);mytoled.pixelset(21,50);mytoled.pixelset(22,50);mytoled.pixelset(23,50);mytoled.pixelset(26,50);mytoled.pixelset(27,50);mytoled.pixelset(28,50);mytoled.pixelset(29,50);mytoled.pixelset(30,50);mytoled.pixelset(31,50);mytoled.pixelset(39,50);mytoled.pixelset(40,50);mytoled.pixelset(41,50);mytoled.pixelset(42,50);mytoled.pixelset(43,50);mytoled.pixelset(44,50);mytoled.pixelset(45,50);mytoled.pixelset(48,50);mytoled.pixelset(49,50);mytoled.pixelset(50,50);mytoled.pixelset(51,50);mytoled.pixelset(55,50);mytoled.pixelset(56,50);mytoled.pixelset(57,50);mytoled.pixelset(58,50);mytoled.pixelset(67,50);mytoled.pixelset(68,50);mytoled.pixelset(69,50);mytoled.pixelset(70,50);mytoled.pixelset(77,50);mytoled.pixelset(78,50);mytoled.pixelset(79,50);mytoled.pixelset(80,50);mytoled.pixelset(81,50);mytoled.pixelset(86,50);mytoled.pixelset(87,50);mytoled.pixelset(88,50);mytoled.pixelset(96,50);mytoled.pixelset(97,50);mytoled.pixelset(98,50);mytoled.pixelset(99,50);mytoled.pixelset(100,50);mytoled.pixelset(101,50);mytoled.pixelset(102,50);mytoled.pixelset(105,50);mytoled.pixelset(106,50);mytoled.pixelset(107,50);mytoled.pixelset(108,50);mytoled.pixelset(112,50);mytoled.pixelset(113,50);mytoled.pixelset(114,50);mytoled.pixelset(115,50);mytoled.pixelset(122,50);mytoled.pixelset(123,50);mytoled.pixelset(124,50);mytoled.pixelset(125,50);mytoled.pixelset(20,51);mytoled.pixelset(21,51);mytoled.pixelset(22,51);mytoled.pixelset(23,51);mytoled.pixelset(20,52);mytoled.pixelset(21,52);mytoled.pixelset(22,52);mytoled.pixelset(23,52);mytoled.pixelset(20,53);mytoled.pixelset(21,53);mytoled.pixelset(22,53);mytoled.pixelset(23,53);mytoled.pixelset(20,54);mytoled.pixelset(21,54);mytoled.pixelset(22,54);mytoled.pixelset(23,54);mytoled.pixelset(20,55);mytoled.pixelset(21,55);mytoled.pixelset(22,55);mytoled.pixelset(23,55);mytoled.pixelset(20,56);mytoled.pixelset(21,56);mytoled.pixelset(22,56);mytoled.pixelset(23,56);mytoled.pixelset(21,57);mytoled.pixelset(22,57);mytoled.pixelset(23,57);mytoled.pixelset(22,58);mytoled.pixelset(23,58);mytoled.pixelset(23,59);对于(uint8_t indi=0;Idii<254;indi++)mytoled.setContrastControl(indi);延迟(5);延迟(5000);对于(uint8_t indi=255;1;indi——)mytoled.setContrastControl(indi);延迟(5);}mytoled.setContrastControl(0);mytoled.clearDisplay();mytoled.setContrastControl(128);endif
       

一旦你成功地将代码上传到你的板上,您应该看到下面的GIF:

示例1 GIF

如果你看一下展示标志函数,您将看到Sparkfun徽标是逐像素计算亚博官网和绘制的。这是使用上面的image-to-pixel python脚本计算的。由于某些Arduino板内存限制,图像以这种方式绘制。也许这不是最有效的方法,但它起了作用。

您还将注意到本例中的注释是稀疏的-本例旨在让您启动并运行,并向您展示OLED的工作原理。下一个例子是,我们将更深入地演示如何使用绘图功能创建自己的应用程序。

示例2:绘图基础

这个例子展示了绘制形状的一些基本功能,包括线,矩形,圆圈,多边形。一旦上传,您应该注意到透明OLED上显示了不同的形状。要么选择文件>实例>亚博官网Sparkfun超显示透明图形OLED库>示例2绘图基础或者将下面的代码复制并粘贴到新的Arduino窗口中。

语言:C/*带您参观透明图形OLED的基本功能,作者:Owen Lyke Sparkfun Electronics日期:2月27日,亚博官网2019年执照:麻省理工学院。有关更多信息,请参阅许可证文件,但基本上可以使用此代码执行任何操作。想支持开源硬件吗?亚博国际官网从Sparkfun买一块木板!亚博官网https://www.亚博官网sparkfun.com/products/15173图形库就像一个三层蛋糕。它们来自自上而下的https://github.com/sparkfun/sparkfun_hy亚博官网perdisplay https://github.com/sparkfun/hyperdisplay_ssd1309_arduinolibrary https://github.com/sparkfun/hyperdisplay_ug2856klbag01_arduinolibrary硬件兼容性-此板上的IO插脚设计用于3.3V,因此如果您使用的是5V微控制器pl轻松使用水平移动器。注:Sparkfun开发板上的Qwiic连接器已经达亚博官网到3.3V-此显示器依赖于微控制器中图形数据的副本,总共1024字节。这是UNO上可用的RAM的一半,因此很容易遇到与内存不足有关的恶意错误。我们建议使用内存更大的micro,比如samd21,ESP32,TENSIY等。硬件连接:选项1(I2c):如果您有QWIIC兼容板,并且计划使用I2c选项2(SPI),则使用QWIIC跳线进行连接:将SCLK和MOSI连接到您选择的SPI端口(UNO-like板上的SPI为13和11),同时将D/C和CS连接到您选择的两个未使用的GPIO引脚(并设置正确的引脚定义为低)不要忘记电源-连接3.3V和GND*/包括“hyperdisplay_g2856klbag01.h”//您的库可以安装在这里:http://librarymanager/all sparkfun_transparent_graphical_oled//层蛋糕的其余部分:http://librarymanager/all sparkfun_hyperdisplay_ssd1309//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////亚博官网///////////////////////////////////////////////////////////////////////////////////////////////////////2/操作可选define cs_pin 4//仅当使用_spi==1 define dc_pin 5//时使用,仅当使用_spi==1 define use _spi 0//选择接口时使用。0=I2C,1=SPI//最终用户设置//对象声明。如果使用SPI ug2856klbag01,则每个接口选项都存在一个类;//声明一个基于SPI的透明OLED对象,名为mytoled else ug2856klbag01_i2c mytoled;//声明一个基于I2c的透明OLED对象,名为mytoled endif/*使用_spi*/void setup()serial.begin(9600);serial.println(“example2_drawingbasics:transparent graphical oled”);if use_spi_port.begin();mytoled.begin(cs_pin,DCPIN,斯皮尔波特);//BEGIN FOR SPI要求您提供CS和DC管脚号ELSE WIRE U PORT.BEGIN();mytoled.begin(接线端口,错误的,ssd1309_-ard-u未使用的_-pin);//begin for i2c具有每个参数线的默认值。setclock(400000);endif/*usse_spi*/**drawing with the transparent graphical OLED**toled display is a 1 bit per pixel display,这意味着每个像素都可以打开或关闭。还可以*提高/降低整个显示器的对比度,但不能单独使用任何像素。**这种简单性使Toled Hyperdisplay驱动程序不必担心颜色,相反,每个超显示函数都有两种变体——一种是“设置”像素,另一种是“清除”像素。在下面的代码块中,我们将尝试*这些函数中的一些。注:所有“set”函数都有一个“clear”对应项,它关闭像素,但我们*将只在注释中显示这些内容,以避免冗余*/uint8_t x0=0;uint8_t y0=0;uint8_t x1=0;uint8_t y1=0;uint8_t r=0;X0=5;Y0=5;mytoled.pixelset(X0,Y0);//提供要设置或清除的单个像素的x和y位置//mytoled.pixel clear(x0,Y0);//x0=10;Y0=10;X1=65;Y1=35;mytoled.矩形集(X0,Y0X1,Y1);//从(x0,y0)到(x1),y1)mytoled.矩形集(x0+2,Y0+ 2,X1-2,Y1-2,真的);//提供“filled”参数为true以填充矩形//MyToled.RectangleClear(X0,Y0X1,Y1);//mytoled.矩形清除(x0+2,Y0+ 2,X1-2,Y1-2,真的);X0=70;Y0=5;X1=85;Y1=50;mytoled.lineset(X0,Y0X1,Y1);//从(x0,y0)到(x1),y1)mytoled.lineset(x0+5,Y0X1+ 5,Y13);//绘制一条宽度为3//mytoled.lineset(x0,Y0X1,Y1);//mytoled.lineset(x0+5,Y0X1+ 5,Y13);X0=108;Y1=24;r=14;mytoled.circleset(X0,Y1R);//以(X0,Y0)半径为r mytoled.Circleset(X0,Y1R 4,真的);//填写//MyToled.CircleSet(X0,Y1R);//mytoled.circleset(x0,Y1R 4,真的);hd_范围_t x[]=5,42,52 };hd范围y[]=48,40,60 };uint8_t numsides=sizeof(x)/sizeof(hd_extent_t);mytoled.多边形集(x,Y纽曼斯);//做一个在x上有numSides的多边形,Y坐标对//mytoled.polygonclear(x,Ynumsides);void loop()mytoled.pixelset(126,2);延迟(1000);mytoled.pixelclear(126,2);延迟(1000);

示例二显示

虽然例2详细介绍了如何使用绘图功能,这在解释一件事上是不够的;尤其是在创建和开始肌肉发达的对象。创建对象时,可以选择γI2CγSPI类名称的后缀(ug2856klbag01)。这当然改变了预期的通信协议。

如果你使用QWIIC,选择我C.接口决策还影响您使用开始()通过更改期望的参数来执行函数。为了我C可以指定要使用的Arduino“Wire”对象,哪一个C要使用的地址,和一个用于选择i的pinC地址。

为了我C所有参数都有默认值,因此只需使用mytoled.begin();对于SPI,前两个参数是必需的,但第三个(允许您选择要使用的SPI端口)可以省略(例如。mytoled.begin(cs_pin,DCPIN);

示例3:高级功能

这个例子有一些严肃的Mario Goalz。上传时,你会看到马里奥上下跳跃,最后降落在一根管子上。要么选择文件>实例>亚博官网Sparkfun超显示透明图形OLED库>示例3:U高级功能或者将下面的代码复制并粘贴到新的Arduino窗口中。

语言:C/*带您参观透明图形OLED的基本功能,作者:Owen Lyke Sparkfun Electronics日期:2月28日,亚博官网2019年执照:麻省理工学院。有关更多信息,请参阅许可证文件,但基本上可以使用此代码执行任何操作。想支持开源硬件吗?亚博国际官网从Sparkfun买一块木板!亚博官网https://www.亚博官网sparkfun.com/products/15173图形库就像一个三层蛋糕。它们来自自上而下的https://github.com/sparkfun/sparkfun_hy亚博官网perdisplay https://github.com/sparkfun/hyperdisplay_ssd1309_arduinolibrary https://github.com/sparkfun/hyperdisplay_ug2856klbag01_arduinolibrary硬件兼容性-此板上的IO插脚设计用于3.3V,因此如果您使用的是5V微控制器pl轻松使用水平移动器。注:Sparkfun开发板上的Qwiic连接器已经达亚博官网到3.3V-此显示器依赖于微控制器中图形数据的副本,总共1024字节。这是UNO上可用的RAM的一半,因此很容易遇到与内存不足有关的恶意错误。我们建议使用内存更大的micro,比如samd21,ESP32,TENSIY等。硬件连接:选项1(I2c):如果您有QWIIC兼容板,并且计划使用I2c选项2(SPI),则使用QWIIC跳线进行连接:将SCLK和MOSI连接到您选择的SPI端口(UNO-like板上的SPI为13和11),同时将D/C和CS连接到您选择的两个未使用的GPIO引脚(并设置正确的引脚定义为低)不要忘记电源-连接3.3V和GND*/包括“hyperdisplay_g2856klbag01.h”//您的库可以安装在这里:http://librarymanager/all sparkfun_transparent_graphical_oled//层蛋糕的其余部分:http://librarymanager/all sparkfun_hyperdisplay_ssd1309//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////亚博官网///////////////////////////////////////////////////////////////////////////////////////////////////////2/操作可选define cs_pin 4//仅当使用_spi==1 define dc_pin 5//时使用,仅当使用_spi==1 define use _spi 0//选择接口时使用。0=I2C,1=SPI//最终用户设置//对象声明。如果使用SPI ug2856klbag01,则每个接口选项都存在一个类;//声明一个基于SPI的透明OLED对象,名为mytoled else ug2856klbag01_i2c mytoled;//声明一个基于I2c的透明OLED对象,名为mytoled endif/*使用_spi*/void setup()serial.begin(9600);serial.println(“example3_-advancedfeatures:transparent graphical oled”);如果使用_-spi-spi-port.begin();mytoled.begin(cs_pin,DCPIN,斯皮尔波特);//BEGIN FOR SPI要求您提供CS和DC管脚号ELSE WIRE U PORT.BEGIN();mytoled.begin(接线端口,错误的,ssd1309_-ard-u未使用的_-pin);//begin for i2c具有每个参数wire的默认值。setclock(400000);endif/*usse_spi*/wind_info_t defaultwindow,我的窗口;//创建一些窗口对象//将窗口初始化为默认设置//(这是一个非常重要的步骤,除非您特别//小心手动初始化每个参数)mytoled.setwindowdefaults(&defaultwindow);mytoled.setWindowDefaults(&myWindow);//我们可以设置窗口mywindow.xmin=25的矩形活动区域;mywindow.ymin=05;mywindow.xmax=73;mywindow.ymax=48;//所有绘图函数都使用窗口相对坐标//这样可以很容易地重新定位整个合成//首先让我们在默认窗口(相当于整个屏幕)上绘制一条线mytoled.lineset(0,0,15,43);//现在,让我们更改活动窗口并绘制相同的线延迟(1000);mytoled.pccurrentWindow=我的窗口&myWindow;mytoled.lineset(0,0,15,43);延迟(2000);//为了更好地说明窗口的位置,我们来填充它。mytoled.windowset();//在当前窗口上调用不带参数的windowset。//mytoled.windowclear();延迟(2000);/记住,绘图功能与当前窗口相关,//所以你不必做额外的数学!mytoled.环形耳环(25,20,10);//加些比萨!延迟(2000);//您也可以将一个窗口传递给windowset/clear来填充它,而不必更改当前窗口mytoled.window clear(&defaultwindow);//默认初始化将清除整个屏幕void loop()if!定义(uu avr_atmega328p_uuu)&!defined(uuavr_atmega168_uuuuu)//现在举一个例子来说明您可能对一个窗口做什么……风信息马里奥斯温多,管道窗;mytoled.setwindowdefaults(&marioswindow);mytoled.setWindowDefaults(&pipeWindow);//使窗口足够大,以便Mario Marioswindow.xmax=21;marioswindow.ymax=28;pipewindow.xmax=24;pipewindow.ymax=24;//将窗口移动到起始位置movewindow(0,34,马里奥斯窗;移动窗口(103)63-25,管道窗口;//绘制管道mytoled.pccurrentWindow=&pipeWindow;SuffPIE();//在开始位置mytoled.pccurrentWindow=绘制Mario;//把马里奥搬到他的家mytoled.windowclear();移动窗口(15)- 15,马里奥斯窗;;mytoled.windowclear();移动窗口(15)15,马里奥斯窗;;mytoled.windowclear();移动窗口(13)- 15,马里奥斯窗;;mytoled.windowclear();移动窗口(13)15,马里奥斯窗;;mytoled.windowclear();移动窗口(13)- 15,马里奥斯窗;;mytoled.windowclear();移动窗口(13)15,马里奥斯窗;;mytoled.windowclear();移动窗口(5)- 23,马里奥斯窗;;mytoled.windowclear();移动窗口(17)0,马里奥斯窗;;延迟(5000);mytoled.windowclear();endif void movewindow(int8_t x,国际标准化组织,wind_info_t*pwind)pwind->xmin+=x;pwind->ymin+=y;pwind->xmax+=x;pwind->ymax+=y;如果!定义(uu avr_atmega328p_uuu)&!定义(uuAvr_Atmega168_uuuuuuuvoid Showmario(void)mytoled.pixelset(6,2);mytoled.pixelset(7,2);mytoled.pixelset(8,2);mytoled.pixelset(9,2);mytoled.pixelset(10,2);mytoled.pixelset(11,2);mytoled.pixelset(12,2);mytoled.pixelset(13,2);mytoled.pixelset(5,3);mytoled.pixelset(6,3);mytoled.pixelset(7,3);mytoled.pixelset(8,3);mytoled.pixelset(9,3);mytoled.pixelset(10,3);mytoled.pixelset(11,3);mytoled.pixelset(12,3);mytoled.pixelset(13,3);mytoled.pixelset(14,3);mytoled.pixelset(15,3);mytoled.pixelset(16,3);mytoled.pixelset(17,3);mytoled.pixelset(18,3);mytoled.pixelset(4,4);mytoled.pixelset(5,4);mytoled.pixelset(6,4);mytoled.pixelset(7,4);mytoled.pixelset(8,4);mytoled.pixelset(9,4);mytoled.pixelset(10,4);mytoled.pixelset(11,4);mytoled.pixelset(12,4);mytoled.pixelset(13,4);mytoled.pixelset(14,4);mytoled.pixelset(15,4);mytoled.pixelset(16,4);mytoled.pixelset(17,4);mytoled.pixelset(18,4);mytoled.pixelset(4,5);mytoled.pixelset(5,5);mytoled.pixelset(6,5);mytoled.pixelset(7,5);mytoled.pixelset(8,5);mytoled.pixelset(9,5);mytoled.pixelset(10,5);mytoled.pixelset(11,5);mytoled.pixelset(12,5);mytoled.pixelset(13,5);mytoled.pixelset(14,5);mytoled.pixelset(15,5);mytoled.pixelset(4,6);mytoled.pixelset(5,6);mytoled.pixelset(6,6);mytoled.pixelset(7,6);mytoled.pixelset(8,6);mytoled.pixelset(9,6);mytoled.pixelset(10,6);mytoled.pixelset(11,6);mytoled.pixelset(12,6);mytoled.pixelset(13,6);mytoled.pixelset(14,6);mytoled.pixelset(15,6);mytoled.pixelset(3,7);mytoled.pixelset(4,7);mytoled.pixelset(5,7);mytoled.pixelset(6,7);mytoled.pixelset(7,7);mytoled.pixelset(8,7);mytoled.pixelset(9,7);mytoled.pixelset(10,7);mytoled.pixelset(11,7);mytoled.pixelset(12,7);mytoled.pixelset(13,7);mytoled.pixelset(14,7);mytoled.pixelset(15,7);mytoled.pixelset(16,7);mytoled.pixelset(17,7);mytoled.pixelset(18,7);mytoled.pixelset(3,8);mytoled.pixelset(4,8);mytoled.pixelset(5,8);mytoled.pixelset(6,8);mytoled.pixelset(7,8);mytoled.pixelset(8,8);mytoled.pixelset(9,8);mytoled.pixelset(10,8);mytoled.pixelset(11,8);mytoled.pixelset(12,8);mytoled.pixelset(13,8);mytoled.pixelset(14,8);mytoled.pixelset(15,8);mytoled.pixelset(16,8);mytoled.pixelset(17,8);mytoled.pixelset(18,8);mytoled.pixelset(3,9);mytoled.pixelset(4,9);mytoled.pixelset(5,9);mytoled.pixelset(6,9);mytoled.pixelset(7,9);mytoled.pixelset(8,9);mytoled.pixelset(9,9);mytoled.pixelset(10,9);mytoled.pixelset(11,9);mytoled.pixelset(12,9);mytoled.pixelset(13,9);mytoled.pixelset(14,9);mytoled.pixelset(15,9);mytoled.pixelset(16,9);mytoled.pixelset(17,9);mytoled.pixelset(18,9);mytoled.pixelset(19,9);mytoled.pixelset(3,10);mytoled.pixelset(4,10);mytoled.pixelset(5,10);mytoled.pixelset(6,10);mytoled.pixelset(7,10);mytoled.pixelset(8,10);mytoled.pixelset(9,10);mytoled.pixelset(10,10);mytoled.pixelset(11,10);mytoled.pixelset(12,10);mytoled.pixelset(13,10);mytoled.pixelset(14,10);mytoled.pixelset(15,10);mytoled.pixelset(16,10);mytoled.pixelset(17,10);mytoled.pixelset(18,10);mytoled.pixelset(3,11);mytoled.pixelset(4,11);mytoled.pixelset(5,11);mytoled.pixelset(6,11);mytoled.pixelset(7,11);mytoled.pixelset(8,11);mytoled.pixelset(9,11);mytoled.pixelset(10,11);mytoled.pixelset(11,11);mytoled.pixelset(12,11);mytoled.pixelset(13,11);mytoled.pixelset(14,11);mytoled.pixelset(15,11);mytoled.pixelset(16,11);mytoled.pixelset(17,11);mytoled.pixelset(18,11);mytoled.pixelset(6,12);mytoled.pixelset(7,12);mytoled.pixelset(8,12);mytoled.pixelset(9,12);mytoled.pixelset(10,12);mytoled.pixelset(11,12);mytoled.pixelset(12,12);mytoled.pixelset(13,12);mytoled.pixelset(14,12);mytoled.pixelset(15,12);mytoled.pixelset(16,12);mytoled.pixelset(5,13);mytoled.pixelset(6,13);mytoled.pixelset(7,13);mytoled.pixelset(8,13);mytoled.pixelset(9,13);mytoled.pixelset(10,13);mytoled.pixelset(11,13);mytoled.pixelset(12,13);mytoled.pixelset(13,13);mytoled.pixelset(4,14);mytoled.pixelset(5,14);mytoled.pixelset(6,14);mytoled.pixelset(7,14);mytoled.pixelset(8,14);mytoled.pixelset(9,14);mytoled.pixelset(10,14);mytoled.pixelset(11,14);mytoled.pixelset(12,14);mytoled.pixelset(13,14);mytoled.pixelset(3,15);mytoled.pixelset(4,15);mytoled.pixelset(5,15);mytoled.pixelset(6,15);mytoled.pixelset(7,15);mytoled.pixelset(8,15);mytoled.pixelset(9,15);mytoled.pixelset(10,15);mytoled.pixelset(11,15);mytoled.pixelset(12,15);mytoled.pixelset(13,15);mytoled.pixelset(14,15);mytoled.pixelset(15,15);mytoled.pixelset(16,15);mytoled.pixelset(17,15);mytoled.pixelset(18,15);mytoled.pixelset(2,16);mytoled.pixelset(3,16);mytoled.pixelset(4,16);mytoled.pixelset(5,16);mytoled.pixelset(6,16);mytoled.pixelset(7,16);mytoled.pixelset(8,16);mytoled.pixelset(9,16);mytoled.pixelset(10,16);mytoled.pixelset(11,16);mytoled.pixelset(12,16);mytoled.pixelset(13,16);mytoled.pixelset(14,16);mytoled.pixelset(15,16);mytoled.pixelset(16,16);mytoled.pixelset(17,16);mytoled.pixelset(18,16);mytoled.pixelset(1,17);mytoled.pixelset(2,17);mytoled.pixelset(3,17);mytoled.pixelset(4,17);mytoled.pixelset(5,17);mytoled.pixelset(6,17);mytoled.pixelset(7,17);mytoled.pixelset(8,17);mytoled.pixelset(9,17);mytoled.pixelset(10,17);mytoled.pixelset(11,17);mytoled.pixelset(12,17);mytoled.pixelset(13,17);mytoled.pixelset(14,17);mytoled.pixelset(15,17);mytoled.pixelset(16,17);mytoled.pixelset(17,17);mytoled.pixelset(18,17);mytoled.pixelset(19,17);mytoled.pixelset(1,18);mytoled.pixelset(2,18);mytoled.pixelset(3,18);mytoled.pixelset(4,18);mytoled.pixelset(5,18);mytoled.pixelset(6,18);mytoled.pixelset(7,18);mytoled.pixelset(8,18);mytoled.pixelset(9,18);mytoled.pixelset(10,18);mytoled.pixelset(11,18);mytoled.pixelset(12,18);mytoled.pixelset(13,18);mytoled.pixelset(14,18);mytoled.pixelset(15,18);mytoled.pixelset(16,18);mytoled.pixelset(17,18);mytoled.pixelset(18,18);mytoled.pixelset(19,18);mytoled.pixelset(1,19);mytoled.pixelset(2,19);mytoled.pixelset(3,19);mytoled.pixelset(4,19);mytoled.pixelset(5,19);mytoled.pixelset(6,19);mytoled.pixelset(7,19);mytoled.pixelset(8,19);mytoled.pixelset(9,19);mytoled.pixelset(10,19);mytoled.pixelset(11,19);mytoled.pixelset(12,19);mytoled.pixelset(13,19);mytoled.pixelset(14,19);mytoled.pixelset(15,19);mytoled.pixelset(16,19);mytoled.pixelset(17,19);mytoled.pixelset(18,19);mytoled.pixelset(19,19);mytoled.pixelset(1,20);mytoled.pixelset(2,20);mytoled.pixelset(3,20);mytoled.pixelset(4,20);mytoled.pixelset(5,20);mytoled.pixelset(6,20);mytoled.pixelset(7,20);mytoled.pixelset(8,20);mytoled.pixelset(9,20);mytoled.pixelset(10,20);mytoled.pixelset(11,20);mytoled.pixelset(12,20);mytoled.pixelset(13,20);mytoled.pixelset(14,20);mytoled.pixelset(15,20);mytoled.pixelset(16,20);mytoled.pixelset(17,20);mytoled.pixelset(18,20);mytoled.pixelset(19,20);mytoled.pixelset(1,21);mytoled.pixelset(2,21);mytoled.pixelset(3,21);mytoled.pixelset(4,21);mytoled.pixelset(5,21);mytoled.pixelset(6,21);mytoled.pixelset(7,21);mytoled.pixelset(8,21);mytoled.pixelset(9,21);mytoled.pixelset(10,21);mytoled.pixelset(11,21);mytoled.pixelset(12,21);mytoled.pixelset(13,21);mytoled.pixelset(14,21);mytoled.pixelset(15,21);mytoled.pixelset(16,21);mytoled.pixelset(17,21);mytoled.pixelset(18,21);mytoled.pixelset(19,21);mytoled.pixelset(1,22);mytoled.pixelset(2,22);mytoled.pixelset(3,22);mytoled.pixelset(4,22);mytoled.pixelset(5,22);mytoled.pixelset(6,22);mytoled.pixelset(7,22);mytoled.pixelset(8,22);mytoled.pixelset(9,22);mytoled.pixelset(10,22);mytoled.pixelset(11,22);mytoled.pixelset(12,22);mytoled.pixelset(13,22);mytoled.pixelset(14,22);mytoled.pixelset(15,22);mytoled.pixelset(16,22);mytoled.pixelset(17,22);mytoled.pixelset(18,22);mytoled.pixelset(19,22);mytoled.pixelset(4,23);mytoled.pixelset(5,23);mytoled.pixelset(6,23);mytoled.pixelset(7,23);mytoled.pixelset(8,23);mytoled.pixelset(12,23);mytoled.pixelset(13,23);mytoled.pixelset(14,23);mytoled.pixelset(15,23);mytoled.pixelset(16,23);mytoled.pixelset(4,24);mytoled.pixelset(5,24);mytoled.pixelset(6,24);mytoled.pixelset(7,24);mytoled.pixelset(13,24);mytoled.pixelset(14,24);mytoled.pixelset(15,24);mytoled.pixelset(16,24);mytoled.pixelset(3,25);mytoled.pixelset(4,25);mytoled.pixelset(5,25);mytoled.pixelset(6,25);mytoled.pixelset(14,25);mytoled.pixelset(15,25);mytoled.pixelset(16,25);mytoled.pixelset(17,25);mytoled.pixelset(18,25);mytoled.pixelset(2,26);mytoled.pixelset(3,26);mytoled.pixelset(4,26);mytoled.pixelset(5,26);mytoled.pixelset(6,26);mytoled.pixelset(14,26);mytoled.pixelset(15,26);mytoled.pixelset(16,26);mytoled.pixelset(17,26);mytoled.pixelset(18,26);mytoled.pixelset(19,26);mytoled.pixelset(1,27);mytoled.pixelset(2,27);mytoled.pixelset(3,27);mytoled.pixelset(4,27);mytoled.pixelset(5,27);mytoled.pixelset(6,27);mytoled.pixelset(14,27);mytoled.pixelset(15,27);mytoled.pixelset(16,27);mytoled.pixelset(17,27);mytoled.pixelset(18,27);mytoled.pixelset(19,27);mytoled.pixelset(20,27);}void showpipe(void)mytoled.pixelset(2,2);mytoled.pixelset(3,2);mytoled.pixelset(4,2);mytoled.pixelset(5,2);mytoled.pixelset(6,2);mytoled.pixelset(7,2);mytoled.pixelset(8,2);mytoled.pixelset(9,2);mytoled.pixelset(10,2);mytoled.pixelset(11,2);mytoled.pixelset(12,2);mytoled.pixelset(13,2);mytoled.pixelset(14,2);mytoled.pixelset(15,2);mytoled.pixelset(16,2);mytoled.pixelset(17,2);mytoled.pixelset(18,2);mytoled.pixelset(19,2);mytoled.pixelset(20,2);mytoled.pixelset(21,2);mytoled.pixelset(22,2);mytoled.pixelset(2,3);mytoled.pixelset(22,3);mytoled.pixelset(2,4);mytoled.pixelset(12,4);mytoled.pixelset(13,4);mytoled.pixelset(14,4);mytoled.pixelset(15,4);mytoled.pixelset(16,4);mytoled.pixelset(22,4);mytoled.pixelset(2,5);mytoled.pixelset(12,5);mytoled.pixelset(13,5);mytoled.pixelset(14,5);mytoled.pixelset(15,5);mytoled.pixelset(16,5);mytoled.pixelset(17,5);mytoled.pixelset(22,5);mytoled.pixelset(2,6);mytoled.pixelset(4,6);mytoled.pixelset(5,6);mytoled.pixelset(9,6);mytoled.pixelset(12,6);mytoled.pixelset(13,6);mytoled.pixelset(14,6);mytoled.pixelset(15,6);mytoled.pixelset(16,6);mytoled.pixelset(22,6);mytoled.pixelset(2,7);mytoled.pixelset(12,7);mytoled.pixelset(13,7);mytoled.pixelset(14,7);mytoled.pixelset(15,7);mytoled.pixelset(16,7);mytoled.pixelset(17,7);mytoled.pixelset(22,7);mytoled.pixelset(2,8);mytoled.pixelset(12,8);mytoled.pixelset(13,8);mytoled.pixelset(14,8);mytoled.pixelset(15,8);mytoled.pixelset(16,8);mytoled.pixelset(22,8);mytoled.pixelset(2,9);mytoled.pixelset(12,9);mytoled.pixelset(13,9);mytoled.pixelset(14,9);mytoled.pixelset(15,9);mytoled.pixelset(16,9);mytoled.pixelset(22,9);mytoled.pixelset(2,10);mytoled.pixelset(12,10);mytoled.pixelset(13,10);mytoled.pixelset(14,10);mytoled.pixelset(15,10);mytoled.pixelset(16,10);mytoled.pixelset(17,10);mytoled.pixelset(22,10);mytoled.pixelset(2,11);mytoled.pixelset(4,11);mytoled.pixelset(5,11);mytoled.pixelset(9,11);mytoled.pixelset(12,11);mytoled.pixelset(13,11);mytoled.pixelset(14,11);mytoled.pixelset(15,11);mytoled.pixelset(16,11);mytoled.pixelset(17,11);mytoled.pixelset(18,11);mytoled.pixelset(22,11);mytoled.pixelset(2,12);mytoled.pixelset(3,12);mytoled.pixelset(4,12);mytoled.pixelset(5,12);mytoled.pixelset(6,12);mytoled.pixelset(7,12);mytoled.pixelset(8,12);mytoled.pixelset(9,12);mytoled.pixelset(10,12);mytoled.pixelset(11,12);mytoled.pixelset(12,12);mytoled.pixelset(13,12);mytoled.pixelset(14,12);mytoled.pixelset(15,12);mytoled.pixelset(16,12);mytoled.pixelset(17,12);mytoled.pixelset(18,12);mytoled.pixelset(19,12);mytoled.pixelset(20,12);mytoled.pixelset(21,12);mytoled.pixelset(22,12);mytoled.pixelset(3,13);mytoled.pixelset(6,13);mytoled.pixelset(7,13);mytoled.pixelset(11,13);mytoled.pixelset(13,13);mytoled.pixelset(14,13);mytoled.pixelset(15,13);mytoled.pixelset(16,13);mytoled.pixelset(17,13);mytoled.pixelset(20,13);mytoled.pixelset(21,13);mytoled.pixelset(3,14);mytoled.pixelset(6,14);mytoled.pixelset(14,14);mytoled.pixelset(20,14);mytoled.pixelset(21,14);mytoled.pixelset(3,15);mytoled.pixelset(6,15);mytoled.pixelset(14,15);mytoled.pixelset(15,15);mytoled.pixelset(20,15);mytoled.pixelset(21,15);mytoled.pixelset(3,16);mytoled.pixelset(6,16);mytoled.pixelset(14,16);mytoled.pixelset(15,16);mytoled.pixelset(20,16);mytoled.pixelset(21,16);mytoled.pixelset(3,17);mytoled.pixelset(6,17);mytoled.pixelset(14,17);mytoled.pixelset(15,17);mytoled.pixelset(20,17);mytoled.pixelset(21,17);mytoled.pixelset(3,18);mytoled.pixelset(6,18);mytoled.pixelset(14,18);mytoled.pixelset(15,18);mytoled.pixelset(20,18);mytoled.pixelset(21,18);mytoled.pixelset(3,19);mytoled.pixelset(6,19);mytoled.pixelset(14,19);mytoled.pixelset(20,19);mytoled.pixelset(21,19);mytoled.pixelset(3,20);mytoled.pixelset(6,20);mytoled.pixelset(14,20);mytoled.pixelset(15,20);mytoled.pixelset(20,20);mytoled.pixelset(21,20);mytoled.pixelset(3,21);mytoled.pixelset(6,21);mytoled.pixelset(14,21);mytoled.pixelset(15,21);mytoled.pixelset(20,21);mytoled.pixelset(21,21);mytoled.pixelset(3,22);mytoled.pixelset(6,22);mytoled.pixelset(14,22);mytoled.pixelset(15,22);mytoled.pixelset(20,22);mytoled.pixelset(21,22);mytoled.pixelset(3,23);mytoled.pixelset(6,23);mytoled.pixelset(14,23);mytoled.pixelset(15,23);mytoled.pixelset(20,23);mytoled.pixelset(21,23);mytoled.pixelset(3,24);mytoled.pixelset(6,24);mytoled.pixelset(14,24);mytoled.pixelset(20,24);mytoled.pixelset(21,24);}#Elsevoid Showmario(void)serial.println(f(“抱歉,由于程序内存大小限制,UNO和其他内存不足的微控制器可能无法运行Mario代码。“)”void showpipe(void)serial.println(f(“抱歉,由于程序内存大小限制,UNO和其他内存不足的微控制器可能无法运行Mario代码。“)endif

一旦你上传了代码,你应该看到一个跳动的马里奥朝终点线走去。

马里奥I2c显示屏

本例中引用的“高级功能”是相对于预先定义的“窗口”绘制的功能。“窗口”允许您轻松地将绘图约束到特定区域或对相关对象进行分组。为了突出这一事实,我们制作了一个马里奥角色,里面有一堆硬编码的像素集(x,y)但只需移动活动窗口并重新绘制就可以移动他。在那种情况下,组成马里奥的所有单个像素都是我们想要一起移动的相关对象。

本例中未显示的一个功能是内置的超显示文本打印。原因在于,ESP32板 不支持页眉,因此无法使用默认亚博国际官网字体。然而,打印功能应该在两个都支持的micr控制器上工作亚博国际官网 有足够的内存来保持稳定。退房超显示教程有关此的详细信息。

资源和进一步发展

有关透明图形OLED分接的详细信息,查看以下链接:

下一个项目需要一些灵感吗?亚博官网查看其他一些与显示相关的教程!

MBED启动工具包实验指南

本实验指南将让您开始了解MBED微控制器的精彩世界。在掌握了阿杜诺之后需要找到下一步吗?这是一个将这些技能提升到下一个层次的好地方。

亚博官网Sparkfun发明家的MicroView工具包

Spar亚博官网kFun发明家的MicroView工具包遵循我们久经考验的真正发明家的工具包模型,为您带来11个简单而有趣的实验,向您介绍SparkFun Microview。亚博官网

DIY灯光雕塑

在这个以3D打印为特色的数字制作项目中,亚博官网激光切割,和DIY电子,您将为您的桌面或床头柜构建一个漂亮的设计对象。

亚博在线娱乐官网学习.spa亚博官网rkfun.comγCC BSA SA 3| 亚博官网Sparkfun电子公司科罗拉多州

QWIIC接近传感器(VCNL4040)连接指南 圣诞老人模仿者 https://www.亚博官网sparkfun.com/users/9533 urn:uuid:1f27f7a2-e371-e5fe-58dd-c4be21175281 2019年2月28日00:00:00-07:00

QWIIC接近传感器(VCNL4040)连接指南亚博在线娱乐官网learn.亚博官网sparkfun.com教程

可在线访问:http://sfe.io/t864

介绍

这个QWIIC接近传感器是一个简单的红外存在和环境光传感器利用VCNL4040.此传感器非常适合检测传感器前面是否出现了什么东西;定性检测物体20厘米离开。这意味着你可以检测出是否有什么东西,如果它距离上次阅读之后更近或更远,但很难说7.2厘米远。如果需要精确距离的定量距离读数,看看Sparkfun亚博官网2米4米飞行时间(TOF)传感器,精确到毫米。

亚博官网Sparkfun接近传感器分接头-20cm,VCNL4040(QWIIC)

亚博官网Sparkfun接近传感器分接头-20cm,VCNL4040(QWIIC)

SEN-15177
6.95美元

我们经常在自动毛巾架上看到这种传感器,自动水龙头,等。然而,VCNL4040有无死区并且可以一直读到传感器的表面。Spar亚博官网kfun接近VCNL4040传感器是一种很好的数字替代品PIR传感器.这个QWIIC接近传感器另外还有一个环境光传感器,如果你需要一个数字光传感器为你的下一个闪光大炮。

此板是我们众多QWIIC兼容板之一!只需插上电源即可。不焊接,不知道哪一个是sda或scl,无需电压调节或转换!

所需材料

QWIIC接近传感器需要一些额外的项目才能开始。你可能已经有一些这样的东西了,因此,请根据需要随时修改您的购物车。

亚博官网Sparkfun红板QWIIC

亚博官网Sparkfun红板QWIIC

DEV-15123
19.95美元
亚博官网Sparkfun Qwiic电缆套件

亚博官网Sparkfun Qwiic电缆套件

KIT-150
7.95美元

建议阅读

如果你不熟悉跳线垫或者我C一定要检查一些基础教程。

I2C

I2c简介,目前使用的主要嵌入式通信协议之一。

如何使用跳线垫和PCB跟踪

处理印刷电路板跳线垫和痕迹是一项基本技能。亚博在线娱乐官网了解如何切割印刷电路板痕迹,在焊盘之间添加一个焊接跨接器以重新布线连接,如果痕迹损坏,用绿线法修复痕迹。

如果你不熟悉QWIIC系统,我们推荐阅读这里概述一下.

QWIIC连接系统
QWIIC连接系统

硬件概述

注:如果您想在本教程或示例代码中介绍的内容之外做任何事情,请参阅 VCNL4040产品介绍有关传感器功能的详细信息。

功率发光二极管

有一个电源状态指示灯帮助确保您的QWIIC操纵杆获得电源。您可以通过极化 QWIC连接器系统或突破销压水堆GND提供。此QWIIC系统旨在使用3.3V,确定你是不是使用QWIIC系统时使用另一个电压。

功率发光二极管

VCNL4040传感器

VCNL4040是一个接近传感器(PS)环境光传感器(ALS)和大功率红外发射器(IRED)集成到单个包中。环境光传感器和接近传感器以平行结构工作。两个传感器和红外发射器的组合形成了接近探测器。

VCNL4040传感器

传感器的工作电压范围为2.5V3.6V.建议您将此板与预期的3.3VQWIIC连接系统。VCNL4040还包括出色的温度补偿。对于本指南中未涵盖的任何细节,请参阅数据表.

注:此传感器非常适合检测质量变化(如果上次读取后有物体存在或移动)。如果你需要定量的距离读数,就像精确的距离,看看Sparkfun亚博官网 2米4米飞行时间(TOF)传感器,精确到毫米。

红外线发射器

红外线埃米特免疫红色辉光940纳米波长(对于那些离散的应用)和吸收电流是可编程的(200毫安违约)有关红外发射器的详细信息,请参阅数据表.

环境光传感器(ALS)

VCNL4040提供了16位高分辨率ALS,精确度为10%,不受荧光灯闪烁的影响。环境光感应能力降至0.01勒克斯/步,VCNL4040适用于低透光率透镜设计(暗透镜)。此外,专利的filtrontm技术在不使用微控制器资源的情况下提供了强大的背景光消除能力(包括阳光)。

接近传感器(PS)

接近传感器具有智能持久性,这可以防止对接近感测的错误判断,同时保持快速响应时间。在主动力模式下,为了更灵活的设计和/或省电,可以要求进行单个测量。

QWICIC或IC

C地址

传感器只有一个从机地址0x60(十六进制)7位寻址,跟随我C协议。

连接

使用QWIIC接近传感器的最简单方法是通过QWIIC连接系统。连接器被极化为IC连接和电源。(*它们被系在相应的断开销上。

QWIIC连接器

然而,该板还提供五个带标签的断接销。你可以把这些线接到微控制器的C总线和电源插脚(3.3VGND)如果没有QWIIC连接器。中断针断开,用于触发事件。

突破销

中断引脚

可以为环境光传感器和接近传感器编程高和低中断阈值,允许组件使用最少数量的微控制器资源。可调持久性设置中断事件发生前所需的连续点击量,以防止错误触发。

VCNL4040还支持易于使用的接近亚博国际官网检测逻辑模式,当超过PS高阈值时触发,当接近读数低于PS低阈值时自动重置中断引脚。

通过从中读取数据,可以清除中断。 内部标志寄存器(将其重置为“0”),然后将int pin重置为高。有关中断的更多详细信息,请参阅 数据表.
中断跳线
切割 国际的跨接器将移除 10 KΩ从内部引脚上拔下电阻。
中断跳线

C上拉跳投

切割C跨接器将移除2.2 KΩI的上拉电阻C总线。如果你的i上有很多设备C总线,您可能想拆除这些跳线。不知道怎么剪跳投?在这里阅读!

拉起式跳线

五金件装配

使用QWIIC连接器系统,组装硬件很简单。您只需使用QWIIC电缆将QWIIC接近传感器连接到Redboard QWIIC。否则,你可以用iC引脚,如果没有QWIIC微控制器。只要知道你的输入电压和任何你可能需要做的逻辑电平转移。

硬件连接

阿杜诺图书馆

注:此示例假定您正在桌面上使用最新版本的Arduino IDE。如果这是你第一次使用Arduino,请回顾我们的教程 安装Arduino IDE。如果您以前没有安装过Arduino库,请查看我们的 安装指南。

我们已经编写了一个Arduino库来扩展这个传感器的每个功能。你可以从Arduino图书馆经理那里拿到它,从Github存储库,或者使用下面的下载按钮。

库函数

对Arduino库进行了注释,函数应该是自解释的。然而,下面是可用库函数的详细列表。

注:建议用户先从下一节中的示例开始,然后再将头插入库函数。库示例演示了如何设置VCNL4040的更基本的功能,而不必深入研究数据表。一旦用户熟悉了基本设置,并通过 数据表彻底地,应该更容易遵循 库函数下面。

开始-检查与传感器的通信并将其设置为默认IC线库设置

连接的-检查连接

设置电流-将红外LED接收器电流设置为8种设置之一(75,100,120,140,160,180,200 mA)。

SETrrdutyCy圈-设置红外LED的占空比(最大40)

.setproxInterruptPersistence-设置代理中断持续值。
PS持久性功能1,2,三,4)有助于避免PS int的错误触发。它定义了触发PS中断事件所需的连续点击量。 .setambientinterrupt持久性-设置环境中断持续值
ALS持久性函数1,2,4,8)有助于避免ALS int的错误触发。它定义了触发ALS中断事件所需的连续点击量。

.setproxyintegration时间-设置接近传感器的集成时间
.setambientintegration时间-设置环境光传感器的集成时间

.电源接近-打开设备的代理感应部分电源
.电源关闭接近-关闭设备的代理感应部分

电源环境-打开设备的ALS感应部分的电源
.断电环境-关闭设备的ALS感应部分

.setproxyresolution(设置代理分辨率)-将接近分辨率设置为12或16位

.启用环境中断-启用ALS中断
.disableAmbientInterrupts-禁用ALS中断

.启用智能持久性-打开智能预测
.disablesmart持久性-关闭智能预测
为了加快PS响应时间,智能持久性可防止对接近感测的错误判断,同时保持快速的响应时间。

.EnableActiveForCeMode(启用活动模式)-启用主动力模式
.禁用模式-禁用主动力模式
使用PS的一种极端节能方法是应用PS主动力模式。任何时候主机想要请求一个接近测量,启用主动力模式。这会触发单个PS测量,可从PS结果寄存器中读取。VCNL4040始终处于待机模式。

.TAKESINGLEPROXMEASURE测量-设置触发位,使传感器进行力模式测量并返回待机状态。

.启用白色频道-启用白色测量通道
.禁用Hitechannel-禁用白色测量通道

.EnableProxLogicMode(启用代理逻辑模式)-启用接近检测逻辑输出模式
.disableproxylogicmode(禁用代理模式)-禁用接近检测逻辑输出模式
选择此模式时,当物体接近传感器(值高于高阈值)时,Int Pin被拉低,当物体移开时,Int Pin被重置为高(值低于低阈值)。寄存器:ps_thdh/ps_thdl定义这些阈值级别的设置位置。

.setproxycancellation(设置代理取消)-设置接近感应取消值-有助于减少与环境光的串扰

.setalsHigh阈值-ALS必须高于此值才能触发中断
.setalslowthreshold-ALS必须低于该值才能触发中断

.setproxhighthreshold设置高阈值-接近感测必须高于该值才能触发中断
.setproxlowthreshold-接近感测必须低于该值才能触发中断

接近-读取接近值
获取环境-读取环境光值
格特白-读取白光值
格蒂德-读取传感器ID

.setproxyinterrupttype(设置代理中断类型)-启用四种接近中断类型
IsC密切-中断标志:如果代理值大于高阈值,则为真
伊萨韦-中断标志:如果代理值低于低阈值,则为真
伊斯莱特-中断标志:如果ALS值高于高阈值,则为真
黑暗-中断标志:如果ALS值低于低阈值,则为真

Read命令-从给定的“命令代码”位置读取两个连续字节
写代码-将两个字节写入给定的命令代码位置(8位)

Arduino示例

注:本节是使用QWIIC接近传感器和带Arduino IDE的Redboard QWIIC的示例。它不是用来指导使用i 带Arduino IDE的C设备。

请使用以下链接和Internet以更好地了解我 C以及它在Arduino IDE中的工作方式:

示例1:接近读数

本例输出VCNL4040传感器在串行监视器.

接近值串行输出

尽管是一个定性传感器,您会注意到输出随对象的距离而变化,表面颜色,以及反射率。您还可以使用此设置估计传感器的视野。最大输出值为65535,离传感器最近,最小值(0-1)是传感器能读取的最远值。

例2:有什么东西吗

本例在通电时读取初始读数。如果读数变化很大,传感器会打印出串行监视器.

接近检测的串行输出

此示例还允许接近传感器作为一个双重用途工作光电门.

热车触发接近传感器

热轮TM汽车触发接近传感器。
(*GIF的速度会减慢,以便您在串行监视器中看到输出。)

微控制器的串行输出稍有延迟(几帧);然而,这是由于图像速度减慢而被夸大的。

例3:环境光

此示例将环境光读数输出到终端.

环境光值的串行输出

传感器也是定性的,但是你可以测试光源的入射角是如何影响传感器读数的。

例4:所有读数

此示例输出IR,终端的环境光和白光读数。除了近光感应和环境光感应之外,VCNL4040还有一个“白光”传感器。

所有值的串行输出

示例5:高级设置

这个例子展示了如何使用不同的线端口,快我C以及库支持的各种高级设置。亚博国际官网拜托,参考数据表以及上面列出的库函数以了解更多详细信息。

资源和进一步发展

更多信息,查看以下资源:

需要帮助,开始与阿杜诺和我C?在这里查看这些资源:

下一个项目需要一些灵感吗?亚博官网查看其他一些Qwiic产品教程:

I2C

I2c简介,目前使用的主要嵌入式通信协议之一。

用于Arduino和光子连接指南的QWIIC屏蔽

开始使用我们的Qwiic生态系统,使用用于Arduino或光子的Qwiic防护罩。

亚博官网Sparkfun GPS突破-XA1110(QWIIC)连接指南

通过Qwiic Sparkfun GPS Breakout-XA1110,了解您在世界上的位置。亚博官网

QWIIC紫外线传感器(VEML6075)连接指南

亚博在线娱乐官网学习如何连接你的VEML6075紫外线传感器,并找出什么时候你应该涂一些防晒霜。

亚博在线娱乐官网学习.spa亚博官网rkfun.comγCC BSA SA 3| 亚博官网Sparkfun电子公司科罗拉多州

QWIIC透明OLED HUD连接指南 英格兰蜥蜴 https://www.亚博官网sparkfun.com/users/9376 urn:uuid:5ca02397-9dba-2600-707b-9bdee4c099de 2019年2月21日00:00:00-07:00

QWIIC透明OLED HUD连接指南亚博在线娱乐官网learn.亚博官网sparkfun.com教程

可在线访问:http://sfe.io/t843

介绍

清晰的屏幕不再是科幻世界的东西了!这个QWIIC透明OLED HUD平视显示器)是Spa亚博官网rkfun对所有未来派透明平视显示器需求的答案。你可以透过显示器看到,每个部分是彩色区域,也就是说,虽然没有一个片段可以改变颜色,显示屏上有不同颜色的部分。

亚博官网Sparkfun透明OLED HUD突破(QWIIC)

亚博官网Sparkfun透明OLED HUD突破(QWIIC)

LCD-1579
99.95美元

所需材料

要遵循本教程,你需要以下材料。但你可能并不需要一切,这取决于你拥有什么。把它加入你的购物车,通读指南,并根据需要调整推车。

微控制器

透明OLED HUD需要相当多的RAM,所以你需要一个至少有5500字节RAM的微控制器来控制一切。查看下面的一些可能选项。

亚博官网Sparkfun ESP32东西

亚博官网Sparkfun ESP32东西

DEV-13907
21.95美元
六十
亚博官网Sparkfun SAMD21迷你突破

亚博官网Sparkfun SAMD21迷你突破

DEV-13664
20.95美元
十五
Arduino Mega 2560 R3型

Arduino Mega 2560 R3型

DEV-1061
38.95美元
五十三
亚博官网Sparkfun Redboard Turbo-SAMD21开发板

亚博官网Sparkfun Redboard Turbo-SAMD21开发板

DEV-14812
24.95美元
TENSIY 3.6

TENSIY 3.6

DEV-14057
29.25美元
十三
亚博官网Sparkfun ESP8266 Thing-开发板

亚博官网Sparkfun ESP8266 Thing-开发板

WRL 13711
16.95美元
六十九

电缆

现在要进入Qwiic生态系统,关键是使用QWIIC屏蔽来匹配您对微控制器的偏好。在本教程中,我们将使用QWIIC到面包板适配器电缆。您还需要一条电缆将代码上传到您的微控制器。

USB电缆A到B-6英尺

USB电缆A到B-6英尺

CAB-0512
3.95美元
QWIIC电缆-电路板跳线(4针)

QWIIC电缆-电路板跳线(4针)

PRT-14425
1.50美元

建议阅读

如果你不熟悉QWIIC系统,我们推荐阅读这里概述一下.

QWIIC连接系统
QWIIC连接系统

如果您不熟悉以下教程,我们还建议您查看它们。

串行通信

异步串行通信概念:数据包,信号电平,波特率,UART和更多!

I2C

I2c简介,目前使用的主要嵌入式通信协议之一。

串行终端基础知识

本教程将向您展示如何使用各种终端仿真器应用程序与串行设备通信。

硬件概述

首先,让我们看看我们正在处理的QWIIC HUD的一些特性,所以我们知道在董事会之外会发生什么。

特性 范围
工作电压 1.65 V-3.3V
供电电流 400毫安
C地址 0x30,0x31

请注意,OLED可以拉动约400 mA的电流,所以确保你有足够的电源,尤其是如果OLED不是你唯一的电源。也注意到OLED位于两个i上C地址,所以确保其他任何我C设备不占用地址0x300x31.

插脚

下表列出了所有透明OLED的管脚及其功能。

描述 方向
GND 地面
3.3V 功率
SDA 数据 双向的
SCL 时钟

可选功能

透明OLED分接头具有上拉电阻,连接至IC总线;如果在启用上拉电阻的情况下将多个传感器连接到总线上,并联等效电阻会产生很强的上拉,使总线无法正常工作。作为一般经验法则,如果多个设备连接到总线上,禁用除一对上拉电阻以外的所有电阻。如果需要断开上拉电阻,可以通过切割痕迹在下面突出显示的相应跳线上。

拉起跳远运动员

拉起跳远运动员

板上的LED(下面突出显示)将在板通电时亮起。

功率发光二极管

功率发光二极管

五金件装配

透明OLED HUD需要相当多的RAM(大约5500字节),因此您需要连接到IC针直接连接到没有QWIIC屏蔽的设备。将黄色连接到SCL,蓝色到SDA,红色至3.3V,黑色至接地,使用QWIIC跳线适配器电缆连接至板的各个插脚。在这种情况下,我们把电路板连接到Arduino Mega 2560的IC引脚.

连接到Mega

连接到Arduino Mega的透明OLED HUD

图书馆概况

注:此示例假定您正在桌面上使用最新版本的Arduino IDE。如果这是你第一次使用Arduino,请回顾我们的教程安装Arduino IDE。如果您以前没有安装过Arduino库,请查看我们的安装指南。

第一,你需要亚博官网Sparkfun透明OLED HUDArduino图书馆。您可以通过Arduino库管理器获取此库。寻找亚博官网Sparkfun WiseChip抬头显示器安装最新版本。如果您喜欢从Github存储库手动安装,你可以在这里抓到它们:

在开始绘制草图之前,让我们来看一下我们可以用来控制透明HUD上的段的所有功能。下面的代码初始化罗盘圆中各个部分的功能(ccx()功能,指南针箭头(D0x()功能,胎压指示,目的地距离(H01()K01-()M01()几个小时,公里,和米)转弯距离K02-()M03-()公里和米)手机和TPMS图标(P0x()T0x()最后,这个在速度表和罗盘上(S01a Bar()S15Ba())您不需要使用这些功能中的大部分,因为大多数都用于更高级的功能,比如设置速度计(),但我们还是给了你访问这些部分的权限。打开任何segmetn都很简单,只需使用参数.打电话将关闭它。

语言:CVOID D01(uint8-t动作);void CC1(uint8-t动作);void D02(uint8-t动作);void CC2(uint8-t动作);void D03(uint8-t动作);void CC3(uint8-t动作);void D04(uint8-t动作);void CC4(uint8-t动作);void D05(uint8-t动作);void CC5(uint8-t动作);void D06(uint8-t动作);void CC6(uint8-t动作);vovoid CC6(uint8-t 8-t动作);void D07;void D07 7 7 7 7 7 7 7(0 7-7-7-(uint8_t action);作废cc7(uint8_行动);无效D08(uint8采取行动);无效CC8(uint8采取行动);无效D0X(uint8采取行动);无效C01(uint8采取行动);无效C02(uint8采取行动);无效H01(uint8采取行动);无效K01(uint8采取行动);无效M001(uint8采取行动);无效C03(uint8采取行动);无效K02(uint8采取行动);无效M03(uint8采取行动);无效C03(uint8采取行动);无效K02(uint8采取行动);无效M03(uint8采取行动);无效D0X X(uint8采取行动);无效P01(uint8采取行动);无效C01(uint8采取行动);无效C01(uint8采取行动(uint8_t action);作废p03(uint8_t action;void t01(uint8_t action);void t02(uint8_t action);void s11_bar(uint8_t action);void s15_bar(uint8_t action);

高级功能

透明OLED的可用功能在下图中更容易看到。

片段图

段图。单击放大。

以下所有函数都将根据传递给它们的参数设置一组段

  • 空心圆规圆(uint8_t select);
    • 全部关闭
    • 1-8:除选定项外,全部关闭
    • 都在
    • 10-17:除选定项外,所有项都打开
  • 空心圆规箭头(uint8_t select);---同指南针。
  • 作废RadardistanceUnits(uint8_t action);---打开雷达距离。
  • 无效标志(uint8_t action);---打开标志段。
  • 无效轮胎压力警报(uint8_t action);---显示TPMS文本。
  • 空的速度表(uint8_t action);---显示km/h段。
  • 空的destinationDistanceUnits(uint8_t iconunits);
    • 空白
    • :H
    • :M
    • 公里
  • 空转弯距离单位(uint8_t iconunits);
    • 空白
    • :M
    • 公里

以下功能显示道路和隧道段,通过1打开段。

  • 清空LeftTunnel(uint8_t action);
  • 空的中间隧道(uint8_t action);
  • 无效的righttunnel(uint8_t action);
  • 清空LeftRoad(uint8_t action);
  • 空的中间道路(uint8_t action);
  • 无效的右路(uint8_t action);

以下功能将打开相应的导航段

  • void nav_group(uint8_t action);---触发整个导航组
  • 无效的导航保持(uint8)动作;
  • 空导航左转弯(uint8动作);
  • 无效的导航右转弯(uint8动作);
  • 无效的导航权(uint8行动);
  • void nav_hardleft(uint8_t action);
  • 无效导航(uint8)动作;
  • 无效导航权(uint8行动);
  • 无效导航连续光(uint8-t行动);
  • 无效导航优先权(uint8 t action);

  • 空Radardetector(uint8_t level);

    • :无雷达枪图标
    • :仅雷达枪
    • 2-8:测距仪
  • 无效设置航向(uint8_t speedno);---设定指南针的方向。最大值为199。
  • 空的setdestinationDistance(uint16_t speedno,UIT88T模式;---设置目标段中的距离。最大值为999。
  • 无效的setradardistance(uint16_t speedno,UIT88T模式;---设定雷达段的距离。最大值为999。
  • 无效设置禁用(uint16_t speedno,UIT88T模式;---设定转弯距离。最大值为999。
  • 空隙设置压力(uint8_t speedno,UIT88T模式;---设置轮胎压力。最大值为99
  • 空位设定速度计(uint8_t speedno);---设置速度表。最大值为199。
  • 空的setcallicon(uint8_t iconstatus);

    • 空白
    • 概述
    • :大纲+电话
    • 所有段
  • 空清除所有(空);---清除所有段。

示例代码

既然我们已经安装了库,并且了解了基本功能,让我们运行一些Qwiic透明OLED HUD的例子来看看它的行为。

示例1-所有段

要开始第一个示例,打开文件>实例>自定义库中的示例>亚博官网Sparkfun WiseChip抬头显示器>示例1所有段.在这个例子中,我们首先创建一个威斯奇福德对象调用穆胡德然后在设置()循环。执行此操作的代码如下所示。

语言:C包括
       
        wisechiphud myhud;void setup()myhud.begin();
       

一旦我们初始化了HUD,我们可以开始打开段。主循环简单地遍历并调用所有可用的函数。

语言:cvoid loop()myhud.clearlall();//清除所有段/*************************************Compass Group***************************/MyHud.CompassicCircle(9);/ / 0=全部关闭;1-8=除所选外全部关闭;9=全部;10-17=除所选MYHUD.指南针箭头(9)外,所有开关都打开;/ / 0=全部关闭;1-8=除所选外全部关闭;9=全部;10-17=除所选myhud.setheading(188)之外的所有打开;//max 199/*****************************************雷达探测器组*************************/myhud.radar detector(8);//0=无雷达枪图标;1=仅雷达枪;2-8=距离表myhud.setradardistance(888,0);//最大999 myhud.radardistanceUnits(1);// 0=空白;1=“m”/************************************目的地/航点组******************************/myhud.flag(1);// 0=空白;1=标志图标myhud.setdestinationDistance(888,2);//最大999 myhud.destinationDistanceUnits(3);// 0=空白;1 =“H”;2=“m”;3=“km”myhud.h01(1);// 0=空白;1=“H”/*****************************************退出组******************************/myhud.lefttunnel(1);// 0=空白;1 =隧道;还可以尝试leftroad();中隧道(1);// 0=空白;1 =隧道;还可以尝试midderroad();Myhud.右隧道(1);// 0=空白;1 =隧道;还可以尝试rightroad();/**************************导航组******************************/myhud.nav_组(1);//0=关闭整个导航组;1=myhud.setturdistance上的整个导航组(888,1);//最大999 myhud.turn距离单位(2);// 0=空白;1=“m”;2=“km”//turn groups://nav_keepleft(1);//左转导航(1);//nav_hardleft(1);//导航(1);//导航连续光(1);//导航优先(1);//导航右转弯(1);//nav_hardright(1);//导航灯(1);/**************************呼叫组******************************/myhud.setcallicon(3);// 0=空白;1 =轮廓;2=大纲+电话图标;3=所有段/**********************************TPMS组***************************/MyHud.TirePressureAlert(3);// 0=空白;1 =“TPMS”;2 =“轮胎”;3=所有段myhud.settirepressure(88,1);//max 99/*****************************************速度表组*************************/myhud.setspeedommeter(188);//最大199 myhud.speedometerUnits(1);// 0=空白;1=“km/h”延误(5000);myhud.clearlall();//清除所有段同时(1)

如果你还没有,选择Arduino/Genuino Mega 2560或Mega2560作为董事会,它枚举的COM端口,点击上传!OLED应该像下面的GIF。

示例1输出

示例1输出

示例2-动画图标

在第二个示例中,我们将制作显示片段的动画。要开始第二个示例,打开文件>实例>自定义库中的示例>亚博官网Sparkfun WiseChip抬头显示器>示例2动画图标.我们初始化hud的方法与第一个示例中的方法完全相同。然后,我们继续使用对于循环以循环遍历一组分段的每个可能状态,以使其成为动画。每个循环从0开始,并转到该特定段组的最大选项数。每个循环都有一个很小的延迟,以允许帧之间有一段时间。我们这样做是为了指南针,雷达,电话和TPMS图标。我们在一组片段的每个动画之间清除整个HUD,以确保一次只显示一组。实现这一点的代码如下所示。

语言:cvoid loop()myhud.clearlall();//清除(int j=0;J<2;j++)用于(int i=1;I<9;i++)myhud.圆规圈(i);延迟(50);}}对于(int j=0;J<2;j++)用于(int i=10;I<18;i++)myhud.圆规圈(i);延迟(50);}}myhud.圆规圆(0);对于(int j=0;J<2;j++)用于(int i=1;I<9;i++)myhud.指南针箭头(i);延迟(100);}}对于(int j=0;J<2;j++)用于(int i=10;I<18;i++)myhud.指南针箭头(i);延迟(100);}}myhud.指南针箭头(0);对于(int i=0);I<5;i++)myhud.radardetector(1);延迟(100);myhud.radardetector(0);延迟(100);}Myhud.RadardistanceUnits(1个);对于(int j=800;J>=0;j=j-10)myhud.setradardistance(j,0);Myhud.Radardetector(J/100);}myhud.clearlall();对于(int j=0;J<5;j++)用于(int i=0;I<4;i++)myhud.setcallicon(i);延迟(100);}}myhud.setcallicon(0);轮胎压力警报(3);myhud.设定压力(30,1);延迟(2000);对于(int j=30;J>14;j——)myhud.settirepressure(j,1);延迟(随机(1001000));}对于(int j=0;J<10;j++)用于(int i=1;I<3;i++)myhud.轮胎压力警报(i);延迟(100);}}轮胎压力警报(3);myhud.clearall();同时(1)

如果你还没有,选择Arduino/Genuino Mega 2560或Mega2560作为董事会,它枚举的COM端口,点击上传!上传代码后,透明的HUD应该看起来像下面的GIF。

示例2输出

示例2输出

例3-计数

在第三个示例中,我们会让每个可用的数字显示数到200。要开始第三个示例,打开文件>实例>自定义库中的示例>亚博官网Sparkfun WiseChip抬头显示器>示例2动画图标.在这个例子中,我们按照前面两个示例中的方法初始化OLED。然后,在我们无效循环(),我们清理了抬头显示器,然后开始对于循环计数5秒。我们将索引变量的值写入每个段。实现这一点的代码如下所示。

语言:cvoid loop()myhud.clearlall();//清除所有段,同时(1)为(int i=0;I<200;i+=5)myhud.setheading(i);//最大199 myhud.setradardistance(i,0);//最大999 myhud.setdestinationDistance(i,2);//最大999 myhud.setturndistance(i,1);//最大999 myhud.settirepressure(i,1);//最大99 myhud.setspeedometer(i);//最大199延迟(200);}myhud.clearlall();};

如果你还没有,选择Arduino/Genuino Mega 2560或Mega2560作为董事会,它枚举的COM端口,点击上传!上载此代码会使OLED看起来像下面的GIF。注意TPMS的编号是如何停止在99。这是这些函数如何处理越界数的演示。

示例3输出

示例3输出

资源和进一步发展

现在您已经成功地启动并运行了Qwiic透明OLED HUD连接指南,是时候把它纳入你自己的项目了!亚博官网

更多信息,查看以下资源:

下一个项目需要一些灵感吗?亚博官网查看以下一些相关教程:

亚博官网英特尔爱迪生的SparkFun模块-OLED模块

快速概述了用于爱迪生的OLED块的功能。

光子OLED屏蔽连接指南

光子OLED屏蔽具备为光子项目添加一个小而清晰的OLED屏幕所需的一切。亚博官网本连接指南将向您展示如何开始。
新!

透明图形OLED分接连接指南

未来就在这里!我们的Qwiic透明图形OLED分接允许您使用I2c或SPI连接在透明屏幕上显示自定义图像。

QWIIC微型OLED连接指南

开始用Qwiic微型OLED显示内容。

亚博在线娱乐官网学习.spa亚博官网rkfun.comγCC BSA SA 3| 亚博官网Sparkfun电子公司科罗拉多州

QWIIC操纵杆连接指南 圣诞老人模仿者 https://www.亚博官网sparkfun.com/users/9380 urn:uuid:143d5c37-5e89-e57c-806b-449b2f1109cf 2019年2月21日00:00:00-07:00

QWIIC操纵杆连接指南亚博在线娱乐官网learn.亚博官网sparkfun.com教程

可在线访问:http://sfe.io/t847

介绍

现在,您可以轻松地将HID/控制器添加到项目中!亚博官网这个亚博官网Sparkfun Qwiic操纵杆结合了QWIIC连接系统的便利性和模拟操纵杆,让人联想到拇指棍从PlayStation 2控制器。

亚博官网Sparkfun Qwiic操纵杆

亚博官网Sparkfun Qwiic操纵杆

COM—15168
9.95美元

多亏了一个阁楼QWIC游戏杆,所有必要的位都得到了处理,您的微控制器只需要在I寄存器中查找您的输入。C装置。

所需材料

Qwiic游戏杆需要一些额外的项目才能开始。这个红木QWIC是为Arduino的例子和奎维克帽是树莓派的例子(见下面的注释)。你可能已经有一些这样的东西了,因此,请根据您的需要随意修改您的购物车。

亚博官网Sparkfun红板QWIIC

亚博官网Sparkfun红板QWIIC

DEV-15123
19.95美元
亚博官网Sparkfun Qwiic电缆套件

亚博官网Sparkfun Qwiic电缆套件

KIT-150
7.95美元
亚博官网树莓派的Sparkfun Qwiic帽子

亚博官网树莓派的Sparkfun Qwiic帽子

DEV-1445
5.95美元
覆盆子Pi示例:如果你还没有的话,你需要一个 覆盆子皮标准外围设备.下面列出了一个示例设置。

树莓Pi 3

DEV-13825
九十二
Pi Topceed(绿色)

Pi Topceed(绿色)

KIT-14035
114.95美元
多媒体无线键盘

多媒体无线键盘

WIG-1427
29.95美元 19.95美元

Raspberry Pi™-16GB microSD noobs卡

COM—13945

建议阅读

如果你不熟悉跳线垫,我C或者python一定要签出一些基础教程。

逻辑层次

亚博在线娱乐官网了解3.3V和5V设备和逻辑电平之间的区别。

I2C

I2c简介,目前使用的主要嵌入式通信协议之一。

如何使用跳线垫和PCB跟踪

处理印刷电路板跳线垫和痕迹是一项基本技能。亚博在线娱乐官网了解如何切割印刷电路板痕迹,在焊盘之间添加一个焊接跨接器以重新布线连接,如果痕迹损坏,用绿线法修复痕迹。

Redboard QWIIC连接指南

本教程介绍Redboard Qwiic的基本功能。本教程还介绍了如何开始闪烁LED和使用QWIIC系统。

Raspberry Pi SPI和I2c教程

亚博在线娱乐官网了解如何使用串行I2C和SPI总线在您的树莓PI使用WiRIPPI I/O库的C/C++和PyDef/SMBus的Python。

用于覆盆子皮连接指南的QWIIC帽子

开始使用你的Qwiic板和覆盆子圆周率接口。此QWIIC连接I2C总线(GND,3.3V,SDA,和scl)在您的Raspberry PI上连接到一组Qwiic连接器。

Python编程教程:Raspberry PI入门

本指南将向您展示如何使用Python来控制硬件,在Raspberry PI上编写程序。

如果你不熟悉QWIIC系统,我们推荐阅读这里概述一下.

QWIIC连接系统
QWIIC连接系统

硬件概述

QWIIC操纵杆将报告拇指棍在我上面的位置C和被设计为与Qwiic系统兼容,以便您可以将其添加到您的项目中。亚博官网无焊料

功率发光二极管

有一个电源状态指示灯帮助确保您的QWIIC操纵杆获得电源。您可以通过极化 QWIC连接器系统或突破销压水堆GND提供。QWIIC系统旨在运行3.3V,确定你是不是使用QWIIC系统时使用另一个电压。

车载电源LED

操纵杆

操纵杆类似于模拟PS2(PlayStation 2)控制器上的操纵手柄。方向运动用两个10 KΩ电位器,每个轴一个。该操纵杆还具有一个选择按钮,当按下操纵杆时启动该按钮。

拇指操纵杆

拇指操纵杆

COM—09032
3.95美元

两个电位计连接到阁楼85的模数转换器(ADC)。选择按钮作为阁楼85上的数字输入操作。这允许固件读取旋钮位置和任何按钮按下。

故障排除提示:由于电阻制造公差,静止时,操纵杆可能无法准确读取VCC的一半。你可能想记下“零”的读数,如有必要,将该值存储到程序中。

操纵杆方向

操纵杆包含两个电位计,与一个框架机构连接,该框架机构将水平的垂直的移动(方向如下所示)。

带有操纵杆轴方向的标记图像

电位计是操纵杆两侧的两个蓝色或黑色框。如果在观察每个电位计的中心轴的同时移动操纵杆,你会看到每一个电位器只在一个轴上拾取运动。聪明的,不是吗?

突出显示电位计

选择按钮

操纵杆还包含一个瞬时按钮,当您按下盖子时,该按钮将激活。按钮是操纵杆侧面的小黑匣子。如果你把帽子往下推,你可以看到一个杠杆压在按钮头上。不管操纵杆处于什么位置,操纵杆都能工作。太酷了!

突出显示按钮

阿替尼85

使用预装的固件,ATTINY85充当操纵杆的模拟和数字输入的中间(微控制器)。这允许QWIIC操纵杆通过i报告其位置。C.

在船上的阁楼85

注:要刷新自己的固件,至少,你需要一个 服装程序员和A Pogo针适配器.编写和上传固件并不容易,除非你知道你在做什么;这是 不可取的适合初学者。

QWIC&IC

C地址

在固件中,QWIIC操纵杆的IC地址是可配置的,因此您可以将它们添加到同一总线中,而不会发生冲突问题。

出厂默认值IC从机地址:0x20

C寄存器

地址 描述
0x00 缺省i来自EEPROM的C从机地址
0x01-0x02 固件版本(MSB优先)
0x03—0x04 当前水平位置(最高位优先)
0x05-0x06 当前垂直位置(最高位优先)
0x07 当前按钮位置
0x08 按钮状态:指示上次读取按钮状态后是否按下按钮。读取后清除。
0x09 配置或“锁定“寄存器-防止随机IC地址在I期间更改C扫描并注册转储。地址更改保存到EEPROM之前必须设置为0x13。
0x0A 电流/集IC从机地址(写)。存储在EEPROM中。


注:在操纵杆位置寄存器中,MSB包含10位ADC值的前8位,LSB包含后两位。作为一个例子,这就是库如何将两个寄存器转换回10位值。

uint_16t full10bitvalue=(msb<<8)lsb)>>6;

您可能只能查看MSB并获得8位读数(对于256个位置)。固件是故意这样写的,希望它对那些不需要操纵杆位置的完整分辨率的客户有用。
故障排除提示:
请注意,第一次读取操纵杆位置寄存器时,它将有一个最大值(所有1都是二进制的)。我不确定是固件的问题还是与阁楼85有关,但最初的读数是1023。一旦读到了,之后的所有读数应准确(不包括上述制造公差)。如果你能解决这个问题,请随意 对本教程的评论或在 Github存储库.

连接

该板提供四个带标签的断接销。你可以把这些线接到微控制器的C总线和电源插脚(3.3VGND)如果没有QWIIC连接器。

船上的断接销

然而,使用QWIIC操纵杆的最简单方法是通过QWIIC连接系统。连接器被极化为IC连接和电源。(*它们被系在断开销上。

板上QWIIC连接器

C上拉跳线

切割C跨接器将移除2.2KΩI的电阻C总线。如果你的i上有很多设备C总线,您可能想拆除这些跳线。不知道怎么剪跳投?在这里阅读!

船上的套头衫

五金件装配

Arduino示例

使用QWIIC连接器系统,组装硬件很简单。你需要做的就是连接你的QWIC游戏杆红木QWIC用一个QWIC电缆.否则,你可以用i单片机的C插脚;只要知道逻辑层次,阁楼85的工作电压在1.8到5.5伏之间,EEPROM至少需要2V,否则会损坏。

带红板QWIIC的硬件组件

注:本教程假设您熟悉Arduino产品,并且正在桌面上使用最新稳定版本的Arduino IDE。如果这是你第一次使用Arduino IDE,请回顾我们的教程安装Arduino IDE。

故障排除提示:
最好以QWIIC系统推荐的3.3V为主板供电。然而,如果您有固件版本为2.3的主板,并且意外损坏了EEPROM并注入了新的,随机I C地址。有一种方法可以取代i C地址并再次存储在EEPROM中。完全按照以下步骤操作,您需要从下面使用Arduino库:

  1. 使用QWIIC电缆将QWIIC操纵杆连接到Redboard QWIIC。
  2. 运行示例3查找当前iC地址。
  3. 修改示例2以使用i你刚刚找到的C地址。
  4. 运行示例2并更改iC地址返回到默认地址。
  5. 拔下和QWIIC操纵杆并重新插入。EEPROM应重置为默认IC地址并准备再次使用。

覆盆子Pi示例

使用QWIIC连接器系统,组装硬件很简单。你需要一个QWIC电缆,一亚博官网树莓派的Sparkfun Qwiic帽子,和A覆盆子皮设置与拉姆斯操作系统,监视器,和标准外围设备.(*)如果你不熟悉Qwiic帽子,你可以找到此处连接指南

带Raspberry PI和Qwiic帽子的硬件组件

注:本教程假设您熟悉使用覆盆子圆周率和您有最新的(完整的…使用推荐的软件)版本拉姆斯操作系统你的覆盆子皮。您可以从树莓Pi基金会网站.截至2月2日。第十三2019,我们推荐带桌面和推荐软件的Raspbian Stretch选择权。

如果这是你第一次使用覆盆子圆周率,请到那边去树莓Pi基金会网站使用他们的快速入门指南。我们在这里列出了其中一些:

  1. 设置你的覆盆子圆周率
  2. 用你的覆盆子皮
  3. 文档
  4. 安装文档
    安装文档
    Raspbian文档
    SD卡文档

阿杜诺图书馆

安装Arduino库的最简单方法是搜索亚博官网Sparkfun Qwiic操纵杆在Arduino图书馆管理器中。要手动安装,头朝上到GITHUB页面或者在这里随意下载图书馆!

库函数

对Arduino库进行了注释,函数应该是自解释的。然而,下面是可用库函数的详细列表。

开始()开始(电线)设备地址
创建到i的连接I上的C设备C总线使用默认或指定的IC地址。

输入:UIT88T 设备地址
设备地址的未分配8位整数。如果没有定义,库将使用默认的i 存储在I中的C地址 C库(0x20)。
输出:布尔

真的-连接到我C装置。
错误-未找到或连接任何设备。

连接()
尝试连接到位于i的设备存储在库中的C地址。

输出:布尔

真的-连接到我C装置。
错误-未找到或连接任何设备。

seti2caddress(新地址)
改变我C地址到新地址.一旦改变,新的我C地址保存在QWIIC操纵杆的EEPROM中。使用新的i重新连接到设备C地址。(新地址打印在串行监视器中。

输入:UIT88T 新地址

设备地址的未分配8位整数。

地球大战()
返回操纵杆水平位置的ADC值。

输出:uint16_t

水平轴上操纵杆位置的ADC值的未分配10位整数[0-1023]。

GETVICTIAL()
返回操纵杆垂直位置的ADC值。

输出:uint16_t

未分配的10位整数[0-1023]用于垂直轴上操纵杆位置的ADC值。

GETButON()
返回当前按钮状态(清除复选按钮指示灯-见下文)。

输出:字节

0-按钮当前正在被按下。
1-按钮当前未按下。

检查按钮()
指示在读取按钮状态或调用此函数之间是否按下按钮。然后清除该指示器的寄存器。

输出:字节

0-按钮为不是按下。
1-按钮被按下。

GETVIEWON()
返回固件版本号的字符串。

输出:字符串 美国广播公司

AAA-固件版本(主要)
BBB-固件版本(次要)

实例

有四个例子QWIIC操纵杆Arduino库开始使用Qwiic游戏杆。这些示例文件的名称是自解释的,但如果你想要更多的信息,请参见下面的说明。

  • 示例1_基本_读数

    此示例使用默认i连接到Qwiic操纵杆C地址保存在库中。草图查看当前操纵杆位置和按钮状态的寄存器。然后,该示例在串行监视器上打印出这些值。

  • 示例2_I2c_地址_和_固件

    此示例使用默认i连接到Qwiic操纵杆在草图中设置C地址,然后打印出I串行监视器上的C地址和固件版本。然后草图,从串行监视器获取输入以更改I使用十进制值(dec)的C地址。一旦我C地址更改,它存储在QWIIC操纵杆的EEPROM中。之后,草图使用新的i连接到操纵杆C地址并再次读取固件版本的寄存器。然后,该示例再次在串行监视器上打印出这些值。

  • 示例3-I2c-U扫描仪

    此示例来自C扫描仪示例在Arduino Playground的网页上。草图扫描I上的设备C总线并在串行监视器上报告它们。这对忘记更改i的用户很有用C董事会地址。

  • 示例4_joystic_串行_输出

    此示例显示了如何开始将QWIIC操纵杆用作HID的基本示例。示例草图获取操纵杆的值,并将其转换为串行监视器上的定向打印输出。

Arduino示例

注:本节是使用QWIIC操纵杆和带Arduino IDE的Redboard QWIIC的示例。它不是用来指导使用i 带Arduino IDE的C设备。

请使用以下链接和Internet以更好地了解我 C以及它在Arduino IDE中的工作方式:

例1:基本读数

此草图查看当前操纵杆位置和按钮状态的寄存器;值被发送到串行监视器.确保使用的波特率为9600磅.

通过操纵杆位置和按钮按下进行串行监视器打印输出

例2:IC地址更改和固件版本读取

此草图从串行监视器,以十进制值表示,改变了我设备的C地址。然后读取固件版本以确认地址已更改。确保使用的波特率为9600磅.

串行监视器打印输出I<sup>2<sup>C地址更改

例3:IC扫描器

这张素描来自C扫描仪示例Arduino操场网页.草图扫描I上的设备C总线并在串行监视器.确保使用的波特率为9600磅.

示例4:操纵杆串行输出

此草图获取操纵杆的值并将其转换为串行监视器.如果按下按钮,它也会读出。确保使用的波特率为9600磅.

用于串行监视器打印输出的QWIIC操纵杆的标签

Python示例

注:本节是在Python中使用Qwiic操纵杆和Raspberry PI的示例。它不是用来指导使用i 带有覆盆子PI或Python教程的C设备。

请使用以下链接和Internet以更好地了解我 C以及它在Arduino IDE中的工作方式:

使能IC接口

如果尚未启用,使能I首选项>Raspberry PI配置面板中的C接口。

从桌面访问配置面板 在配置面板上启用I2c

启用IC通过配置面板。

使用命令行检查设备

在(完整的)Raspbian操作系统上,I2CoToots应预先安装(如果不是,跟随此处为说明)用Qwiic操纵杆和Qwiick帽子连接到树莓派上,在终端/命令行中运行以下命令。

I2cDebug -Y 1

下载并运行python示例

下载Python示例Github存储库.您所需要做的就是打开一个示例python文件并执行该模块。您可以在python 3或其他兼容版本中执行此操作,像geany这样的编程文本编辑器。

基本读数

下面是来自基本读数示例文件。

python shell打印输出截图

蛇游戏

当你运行蛇游戏示例代码,您只需单击按钮即可开始游戏。(*向艾尔·斯威格特大声呼喊虫蛀例子,它被调整为与QWIIC操纵杆一起工作。

蛇游戏示例的屏幕截图

故障排除提示:我的确遇到了一个关于Python示例代码的错误。不幸的是,我不是一个 专家在巨蟒和覆盆子皮。然而,我通过打印错误而不是终止脚本来解决这个问题。我可以根据互联网上的可用信息推断出,误差 [errno 121]远程I/O错误是我的问题 C总线以及smbus如何与从设备交互。

你也会得到一个 [errno 121]远程I/O错误如果你我 C地址定义错误。

资源和进一步发展

更多信息,查看以下资源:

产品信息

示例代码和Arduino库

需要帮助,开始与阿杜诺和我C?在这里查看这些资源:

需要帮助开始你的覆盆子圆周率?在这里查看这些资源:

需要帮助开始使用python和我C?在这里查看这些资源:

下一个项目需要一些灵感吗?亚博官网查看其他一些Qwiic产品教程:

亚博官网Sparkfun GPS突破-XA1110(QWIIC)连接指南

通过Qwiic Sparkfun GPS Breakout-XA1110,了解您在世界上的位置。亚博官网

亚博官网Sparkfun Pro NRF52840迷你连接指南

Sparkfun Pro NRF52840 Mini的硬件概述和连接指南,是北欧极品酷炫蓝亚博官网牙/ARM Cortex M4 SoC的突破。

QWIIC单继电器连接指南

开始使用QWIIC单继电器切换高功率负载。

亚博在线娱乐官网学习.spa亚博官网rkfun.comγCC BSA SA 3| 亚博官网Sparkfun电子公司科罗拉多州

拇指操纵杆连接指南 追随 https://www.亚博官网sparkfun.com/users/9384 urn:uuid:c7388015-860c-591c-ae40-ae0fd46f14ee 2019年2月20日00:00:00-07:00

拇指操纵杆连接指南亚博在线娱乐官网learn.亚博官网sparkfun.com教程

可在线访问:http://sfe.io/t870

介绍

抬起头来!本教程适用于拇指操纵杆分接板和护罩。对于那些想快速连接拇指操纵杆而不需要焊接的用户,退房 QWIIC操纵杆[COM-15168]通过i连接 C.

不管你是在爆破外星人,驾驶机器人,或者为你的Arduino写一个很棒的经典街机游戏,你会发现模拟拇指操纵杆对你的项目非常有用的补充。亚博官网本教程将介绍模拟拇指操纵杆分接板举一些阿杜诺的例子。

亚博官网Sparkfun拇指操纵杆突破

亚博官网Sparkfun拇指操纵杆突破

BOB-09110
1.95美元
拇指操纵杆

拇指操纵杆

COM—09032
3.95美元

后来,我们还将检查拇指操纵手柄护罩对于Arduino和处理示例。如果您有一些额外的硬件,您可以按照使用断接板的示例进行操作!

亚博官网Sparkfun操纵杆护罩套件

亚博官网Sparkfun操纵杆护罩套件

DEV-097
14.95美元

建议查看

对于拇指操纵杆的简单演示,看看下面的视频!

所需材料

要遵循本教程,你需要以下材料。但你可能并不需要一切,这取决于你拥有什么。把它加入你的购物车,通读指南,并根据需要调整推车。如果你决定使用转接板,你需要这份愿望清单上的部分。

如果你决定使用护盾,你需要这份愿望清单上的部分。

工具

你需要一个烙铁,焊料,和一般焊接附件.

第三手

第三手

TL—09317
9.95美元
烙铁-60W(可调温度)

烙铁-60W(可调温度)

TL-14566
12.95美元
无铅焊锡-15克管

无铅焊锡-15克管

TL—09163
3.50美元
尖嘴钳

尖嘴钳

TIL-0897
1.95美元
小帕纳维斯- Vacuum Base

小帕纳维斯- Vacuum Base

TL-10410
32.95美元

建议阅读

如果您不熟悉以下概念,我们建议在继续之前先查看这些教程。

上拉电阻

快速介绍上拉电阻-它们很重要,以及如何/何时使用它们。

如何焊接:通孔焊接

本教程涵盖了关于通孔焊接的所有知识。

模数转换

世界是模拟的。使用模数转换来帮助数字设备解释世界。

分压器

用分压器把大电压变成小电压。

什么是Arduino?

这到底是什么“阿杜诺”的东西?

安装Arduino IDE

在Windows上安装和测试Arduino软件的分步指南,雨衣,和Linux。

将Arduino连接到处理

从Arduino发送串行数据到处理和返回-即使在同一时间!

交换基础

关于电子产品最容易被忽视和低估的部件的教程:开关!在这里,我们将解释瞬时开关和保持开关之间的区别,以及所有这些缩写词(不,NC单刀双掷SPST,……站着。

模拟拇指操纵杆如何工作?

想象一下音量控制或其他旋钮。这些控制通常由电位器,它们是可变电阻。通过将电位计连接为分压器,你可以从设备中得到不同的电压,可以喂给模数转换器在微处理器上。这允许软件读取旋钮位置。

电位器

此操纵杆包含两个电位计,连接到体操运动员将“水平”和“垂直”运动分开的机构。(如果操纵杆平放在桌子上,这些动作更多是“前/后”和“左/右”,但是你明白了。)电位计是操纵杆两侧的两个绿色/黑色的盒子。如果在观察每个电位计的中心轴的同时移动操纵杆,你会看到每一个电位器只在一个方向上进行运动。聪明的,不是吗?

操纵杆电位计突出显示

瞬时按钮

这个操纵杆还包含一个开关,当你按下盖子时,它会启动。开关是操纵杆后部的黑色小盒子。如果你把帽子往下推,你可以看到一个杠杆压在开关的头部。不管操纵杆处于什么位置,操纵杆都能工作。酷!

操纵杆迷你按钮突出显示

硬件概述:突破

分接板有5个插脚断开,以便轻松连接到拇指操纵杆。使用操纵杆安装和编程时,确保跟踪板的方向,以确定操纵杆处于什么位置。

拇指操纵杆分接板顶视图

  • 录像机-把这个连接到你的正电源上(通常5V3.3V取决于你的逻辑水平)。
  • 维尔特-这是垂直输出电压(操纵杆居中时约为VCC的一半)。
  • 地平线-这是水平输出电压(操纵杆居中时约为VCC的一半)。
  • 塞尔-这是按钮的输出,常开,按下按钮后将连接到GND。
  • GND-将其连接到地线(GND)。

硬件装配:分接头

要轻松连接到操纵杆,你需要一个“断接板”(红色印刷电路板,或PCB)。你需要把接线板焊接到操纵杆上。从未焊接过?这很容易,查看我们关于如何焊接的教程.如果这是你第一次焊接,在这个板上工作之前先练习一下。阅读指南,你会学到一些好的技巧,帮助你的第一次焊接体验更顺利。

如何焊接:通孔焊接

9月19日,二千零一十三

本教程涵盖了关于通孔焊接的所有知识。

完成后,将操纵杆连接到你的项目上会容易得多(你不必在所有这些小插脚上焊接电线)。亚博官网要将转接板连接到操纵杆上,遵循这些步骤。

将拇指操纵杆插入叉接线板

第一,测试将分接板安装到操纵杆上。如果操纵杆上的任何销弯曲,轻轻地把它们弄直。操纵杆进入带有白色轮廓的板的侧面(而不是带有Sparkfun标志的侧面)。亚博官网将操纵杆插入板中,匹配白色轮廓,确保所有的销子都进入孔中(如果没有,您可能没有正确定位操纵杆)。

插入叉接线板的拇指操纵杆

焊料

如果一切正常,小心地从板的另一侧(带有Sparkfun标志的一侧)焊接针脚。亚博官网焊接前和焊接过程中,确保操纵杆紧贴分接板。有14个焊接接头要制作,包括操纵杆角落的四根柱子。

将所有针脚焊接到接线板上

如果你想把一个5针的头连接到电路板上,或将裸线焊接到输出孔,你现在可以这样做。

焊头至焊脚断裂

一旦你完成焊接,你已经准备好使用你的操纵杆了!如果你还没有,将盖插入操纵杆上。

焊接拇指操纵杆

Arduino示例:突破

硬件连接

分接板提供五个带标签的连接。您将把这些线路连接到您的项目或微控制器上。亚博官网在这个例子中,我们将在ATMega328P上使用Redboard。为了稳定,确保操纵杆下面有一部分面包板。

拇指操纵杆电路Arduino

联播表

带ATMEGA328P的Redboard 拇指操纵手柄分接头
5V 录像机
A0 版本
A1 霍尔
塞尔
GND GND

拇指操纵杆分接板示例

注:此示例假定您正在桌面上使用最新版本的Arduino IDE。如果这是你第一次使用Arduino,请回顾我们的教程 安装Arduino IDE。

下面是一个Arduino草图的例子,它设置了微控制器来读取输入,然后连续地将这些值打印到串行监视器上。如果你用的是不同的微控制器,步骤应该相似;您只需要确定如何读取设备上的模拟和数字输入。复制代码并将其粘贴到Arduino IDE中。选择Arduino/Genuino乌诺作为董事会,它枚举的COM端口,点击上传按钮。

语言:C//拇指操纵杆分接板示例//修改人:何云“Bobby”Chan,亚博官网Sparkfun电子公司,2/19//作者:Mike Grusin,亚博官网Sparkfun Electronics 3/11//此代码免费,宝贝。您可以随意使用。//此草图显示拇指操纵杆(COM-09032)和分接板(BOB-09110)的基本操作。//操纵杆输出两个模拟电压(垂直和水平)。一个数字信号(SEL)用于按钮。//与操纵杆的连接(如果使用不同的销,则更改):const int vert=0;//analogconst int horiz=1;//analogconst int sel=2;//数字//同时将操纵杆VCC连接到Arduino 5V,操纵杆接地到Arduino接地。//此草图以9600波特的速度输出串行数据(打开串行监视器查看)。//初始化垂直模拟值和数字值的变量,水平的,选择;void setup()/*old method打开Arduino IDE v1.01之前sel线的上拉电阻(参见http://arduino.cc/en/tutorial/digitalpins),使sel线成为输入*//pinmode(sel,输入);//数字写入(sel,高);//使sel行成为输入pinmode(sel,输入插拔);//为输出serial.begin(9600);void loop()//从操纵杆垂直=模拟读取(Vert)读取所有值;//将为0-1023水平=模拟(水平);//将为0-1023,选择=digitalread(sel);//如果不按下,将为高(1),和低(0),如果按下//打印出值serial.print(“垂直”);序列号打印(垂直,DEC);serial.print(“水平:”);序列号打印(水平,DEC);serial.print(“选择”);if(select==high)serial.println(“未按下”);}else serial.println(“pressed!”);}

你应该看到什么

打开串行监视器九千六百波特开始查看原始输出值。垂直方向”“指着你,开始移动操纵杆。

原始输出示例

在这种情况下,当不移动时,操纵杆的垂直和水平值约为520。向上箭头方向顺时针移动操纵杆,操纵杆将读取垂直分量的值约为1023,而水平分量的值相同。向右移动,垂直分量将再次位于约520的静止值,而水平分量将读取约0的值。当操纵杆向下移动时,您会注意到垂直分量将下降到0,水平分量将再次位于其静止值。向左移动操纵杆,当水平分量跳到1023时,垂直分量不会回到其静止值。最后,你会收到一个“按下!”按下操纵杆时显示信息。

用操纵杆寻找更多的例子?查看下一节中有关护罩的示例!

硬件概述:护罩

在焊接任何部件之前,下面是护罩的俯视图。

拇指操纵杆俯视图

  • 操纵杆-在板的左边是拇指操纵杆的示意图。电位计连接到模拟针A0和A1。操纵杆的“选择”按钮连接到插脚2。

  • 原型区-该中心包括一般电镀通孔原型和焊接附加组件,如一个小OLED屏幕,XBee资源管理器,或传感器。根据您的项目,您需要将其连接到各个管脚。亚博官网

  • 12毫米按钮-右侧是四个12毫米瞬时按钮的位置。向上连接到针脚4,针3的权利,向下至引脚5,左至插脚6。

  • 边销-该板是为原始的ArduinoUno封装而设计的,因此您将看到板边缘的标准头。

  • 复位按钮-就在重置销旁边是迷你按钮的位置,当堆叠在顶部时,可以重置Arduino。

硬件组件:护罩

在装配防护罩之前,确保您拥有将电路板焊接在一起所需的所有组件。

操纵手柄护罩组件

如果你订购了一个工具箱,您应该包含以下组件。

所有零件是否存在并说明?伟大的,让我们开始把盾牌放在一起。

将拇指操纵杆和按钮插入护罩

在我开始焊接零件之前,我喜欢对套件组件进行“测试配合”。这让我可以检查一切是否符合预期,而且很有趣。只需仔细完成这些说明的其余部分,将组件放置到位,但不要焊接任何东西。这完全是可选的。

一旦你做了试穿,你可以小心地把部件拔出来,然后真正地把防护罩放在一起!

焊接技巧

如果这是你第一次焊接,你可能会想先看看我们的焊接入门教程.阅读指南,你会学到一些好的技巧,帮助你的第一次焊接体验更顺利。

如何焊接:通孔焊接

9月19日,二千零一十三

本教程涵盖了关于通孔焊接的所有知识。

下面你会找到一个建议的组装防护罩的订单,你的个人偏好可能会给你其他关于如何进行的想法,这也很好。当未提供装配订单时,首先焊接最小的部件是一个很好的规则。只需确保所有部件都在正确的位置和方向上。

如果你没有印刷电路板台钳,那么你可能想把头销放在拇指操纵杆之前-这样你就可以把印刷电路板放在头上,同时焊接头销。(事实上,即使你有虎钳,你也可能想这样做。)

另一种需要考虑的方法是先附加头,这样您就可以在添加每个组件之后测试它是否正常工作。

好吧,让我们从……

迷你按钮开关

迷你按钮重置主Arduino板-它存在是因为一旦屏蔽连接到Arduino,很难访问正常重置按钮。

确保你在看印刷电路板的顶部——顶部是元件所在的地方——上面会有“sparkfun.com”的文字和标志。亚博官网

首先将按钮的四个支脚(或引线)按到PCB上的正确位置,如下图所示。它位于印刷电路板上“重置”一词的正下方。按钮可以指向四个不同的方向,腿朝下,但只有两个方向是正确的-您不需要施加太大的力将按钮固定在孔中。查看下一张特写图片,以更好地查看按钮的位置。

Arduino操纵杆护罩迷你按钮

你可以更清楚地看到下面的腿稍微向外伸展。身体两侧有两对腿-一对腿应位于靠近印刷电路板边缘的一组孔中,另一对腿应位于印刷电路板上标记为“丝印”的白色矩形的相对短边侧。

如果你过度弯曲其中一条腿,轻轻地把它移回原位-但不要经常这样做,否则金属会从金属疲劳中断裂。

在印刷电路板下方有足够的空间让支腿向按钮顶部施加压力,使塑料底部位于印刷电路板上-这允许印刷电路板在您按下按钮时承受大部分的力,而不是薄金属支腿。

迷你按钮特写

下一步把电路板翻过来,你会看到那些可爱的小腿指向印刷电路板上的孔。如果它们没有延伸到图中所示的范围,请检查方向是否正确,然后再施加一点压力使腿弹出。当你把印刷电路板倒置时,按钮不应该从孔中掉出来。

迷你按钮闭合终端

现在是焊接第一个焊脚的时候了——不管你从四个焊脚中的哪一个开始——但是要确保按钮的塑料底部仍然平贴在印刷电路板上。同时用烙铁在印刷电路板上的按钮脚和焊盘(孔周围的轨道圆)上加热,然后小心地将一小块焊料送入烙铁之间形成的接合处。衬垫,以及组件腿。然后按顺序取出焊锡丝和烙铁。

完成一条腿后,再次检查按钮底部是否接触到印刷电路板,然后焊接对角相对的焊脚。按此顺序焊接支腿可确保按钮安装良好,您可以焊接其余两支支支腿,而无需再次检查按钮是否仍正确安装。

当您将按钮的四个支脚全部焊接好后,应如下图所示:

微型按钮焊接端子

如果你喜欢,你可以把黑板翻过来,成功地按下迷你按钮,然后把它展示给你的朋友看。

按钮按钮

现在是时候将四个较大的按钮连接到防护罩上了。这些是操纵杆护罩的“操作”按钮,您可以使用它们来控制屏幕上角色的操作,可能会导致人物开枪,当心情激动时,击打或摆放鲜花。(花艺二:这次是多年生的!)

你会注意到我们使用的方法与我们使用迷你按钮的方法非常相似——这是因为按钮除了大小外,在结构上几乎是相同的。

第一,将四个按钮的支脚插入印刷电路板上的孔中-它们的方向应该是指没有支脚的边缘覆盖白色丝印圆上下的白色丝印线。对于每个按钮,确保所有四条腿都在各自的孔内,然后向按钮顶部施加压力,将腿推到另一侧-如果不小心,可以意外弯曲按钮下的一个或多个腿。如果你真的把一条腿弯到下面,取下按钮,用一把小螺丝刀或一对钳子将弯曲的腿弄直,使其再次位于正确的位置,以便穿过孔。

我建议在焊接它们之前把所有四个按钮都放好,因为当你翻转电路板时,焊脚会防止它们掉出来,而且很高兴能够进入物体的流动中,同时焊接所有的接头。但是,如果你更喜欢在添加下一个按钮之前将每个按钮焊接到位,那么它也可以正常工作。

12毫米按钮

现在,你可以翻转冲浪板,看到按钮腿以类似于游泳比赛中游泳池的方式伸出来。

12毫米按钮底视图

再次是焊接第一个按钮支腿的时候了。我的建议是从最靠近电路板中间的按钮开始,从左到右,从那里向下工作,这样你就不必在已经焊接的接头上移动烙铁。不过,顺序也不重要。

像以前一样,按钮的四个支脚中哪一个开始焊接并不重要,但请记住确保按钮的塑料底部仍然平贴在印刷电路板上。你可能需要从下面把按钮靠在印刷电路板上,因为腿可能有点松,务必只接触塑料部件,因为金属部件会发热。用烙铁同时加热按钮和焊盘的焊脚,然后小心地将一小片焊卷送入烙铁之间形成的接合处。衬垫,以及组件腿。然后按顺序取出焊锡丝和烙铁。

完成一条腿后,再次检查按钮底部是否接触到印刷电路板,然后焊接对角相对的焊脚。按此顺序焊接支腿可确保按钮安装良好,您可以焊接其余两支支支腿,而无需再次检查按钮是否仍正确安装。

完成所有16条腿后,冲浪板应该是这样的-我希望那些游泳运动员今天不打算离开游泳池:

钎焊

拇指操纵杆

正如您在本焊接部分的介绍中所记得的,我建议您从我的经验中学习(尤其是如果您没有PCB虎钳),并在焊接拇指操纵杆之前焊接头部。亚博在线娱乐官网如果是这样的话,请随意跳到收割台部分,然后返回此操纵杆部分。

哈,我不敢相信他们会爱上“先焊头”的把戏,你能?好,你开玩笑是因为在操纵杆前焊接集管确实比较容易,但是如果你坚持的话,下面介绍如何连接操纵杆。只要记住,如果你连接了标题,那么你的板看起来会和这些照片有点不同。

您首先需要将操纵杆的支腿插入到与分接板类似的板中。有相当多不同尺寸的腿,所以小心地把操纵杆推到位是值得的。

你会注意到有很多条腿:

  • 四条腿的小迷你按钮用于中心按钮功能。它位于一块突出的露头上,从白色塑料底座的一侧伸出,看起来与我们的重置迷你按钮非常相似。这些腿很细。
  • 四个比其他腿粗的腿,位于白色塑料底座主体的四个角上。这些支腿只是结构上的,不用于连接任何电信号。
  • 两组三个支腿,每个支腿连接到用于检测二维操纵杆位置的电位计的绿色/黑色主体。

你可能会发现,像我在这些照片中看到的那样,先从操纵杆上取下黑色塑料顶部或“帽子”会更容易些,只要轻轻地拉一下帽子,它就会从中间的木棍上滑下来。把帽子放在一边,这样你就不会把它丢了,或者看看你自己能不能把它戴成帽子,这样你就可能把它丢了。

迷你按钮腿是最难到达正确的地方,所以我建议你先把这些腿与适当的孔对齐。注意,整个操纵杆只能安装在一个方向上,该方向上的迷你按钮朝向印刷电路板的中心。稍微倾斜操纵杆底部可能有助于使离迷你按钮最近的两个结构支腿与按钮支腿处于正确位置的同时,安装到它们的相关孔中。然后倾斜基准面,使其余支腿适合其适当的孔。就像穿上裤子,没有什么比把你的腿伸进错误的洞里更让人恼火的了——所以花点时间确保一切都在它应该在的地方。

如果你真的弯曲了一条腿,首先,试着用小螺丝刀头轻轻地把它推到位,否则,取出操纵杆,把腿伸直再试一次——但是如果你经常这样做,腿可能会因为金属疲劳而折断。

拇指操纵杆插入护罩

在操纵杆外壳顶部施加足够的压力后,所有支腿都应穿过PCB底部-结构支腿将比其他支腿突出更多:

拇指操纵杆插入的闭合终端

对于焊脚的焊接顺序,您有几个选择,但我建议从结构焊脚开始:

  • 确保底座尽可能靠近印刷电路板-它不会完全平齐,因为底座上的塑料凸起会阻止这一点。
  • 然后焊接四个结构支腿,从任何支腿开始。你可以使用比平时更多的焊料来提供额外的支持。亚博国际官网
  • 检查底座是否仍有点齐平。
  • 将对角相对的结构支腿焊接到位。
  • 然后按任意顺序焊接其余两个结构支腿。
  • 结构支腿就位后,我建议焊接两组三个电位计支腿。

最后,确保迷你按钮支脚尽可能穿过印刷电路板,并以与之前相同的方式将按钮焊接到位。

完成后,您的董事会应如下所示:

焊接端子

如果你已经连接了头部,现在你可以翻转面板,将塑料帽重新连接到操纵杆的白色中心柱上-注意,它只适合两个方向,因为中心柱是矩形的。现在可以跳到完成的焊点部分。

如果仍然需要附加标题,可以继续下一节。

在继续前进之前,请随意假装您正在使用操纵杆停靠阿波罗号。(“psssh”推进器噪音不是可选的,如果你这样做。)

为收割台准备护罩

报头

现在是焊接头的时候了。您会注意到在这些图片和零件列表中,我们使用了可堆叠的头段,它允许在这个头段上方堆叠额外的护罩。不过,你们中间的警报会注意到,由于操纵杆的位置,标准护罩无法安装在此护罩顶部,即使安装了标准护罩,也会使至少一个按钮变得模糊。

那么,在这种情况下使用可堆叠的报头有什么好处呢?这意味着您仍然可以将跳线插入到报头中,以访问未使用的插脚。如果你想的话,你也可以在上面加一个定制的迷你盾,如果你愿意的话-也许可以加几个按钮?

如果您认为您不需要这个额外的功能,您可以使用标准的分离头。如果你只用表头填充用过的插脚,如果你需要的话,你可能仍然可以通过印刷电路板上的孔将跳线插入另一个插脚。

六针头

让我们从焊接两个六针头开始,这两个六针头将提供电源并访问模拟管脚。第一,您可以将其中一个标题插入正确的位置,如下所示:

6针收割台特写

如果您没有PCB虎钳,那么您可能需要暂时将其中一个8针头放入其位置,以便在焊接头时使PCB水平。当你翻转电路板的时候,头不会保持在原位,所以当你翻转印刷电路板的时候,头会保持在原位,让针脚向上。

如果您有一个PCB虎钳,您可能希望将割台固定到位,如下图所示:

6销收割台特写侧视图

然后将其中一个销焊接到位。进行此操作时,确保收割台与板边缘尽可能平行:

6针头1针焊接

我们只从一个销开始的原因是因为它更容易获得正确的对齐方式并修复任何错误。一旦你焊接了一个针,您可能希望通过将屏蔽插入Arduino来测试对齐。这样做时要小心,因为只有一个焊点才能固定住收割台。

如果收割台的对齐方式不太正确,小心地重新加热焊点并轻轻移动焊头。不过,取下热量后不要移动它,否则你的关节会很差。以下是检查收割台对齐的示例:

在Arduino上测试收割台对齐

一旦你对头球的对准感到满意,您可以将另一个管脚焊接到位-我的建议是将管头另一端的管脚焊接到您焊接的第一个管脚。原因是,一旦两个端销就位,对齐方式不会改变。我建议再次将其连接到您的Arduino,再次检查对齐是否仍然正常。

再一次,如果对齐不太正确,可以重新加热接头并小心地移动销。

6针头焊接到两个销上

确认对齐后,可以将其余四个销焊接到位:

6针头完全焊接

在此阶段,您可以对第二个6针头重复这些说明,或向前跳焊对角相对的8针头。焊接一个8针的头部现在有助于获得正确的对齐。

八销收割台

好的,同学们,谁能告诉我如何焊接8针头?对,你是对的,与6针头完全相同,除了最后一步,我们有一个额外的2针焊接到位。像以前一样,首先,我们在一端焊接一个销,然后检查对齐情况:

8销收割台固定

然后,我们在收割台的另一端焊接销,并重新检查对齐情况:

8针收割台2针向下堆叠

最后,我们将其余的针脚焊接在收割台的中间。

8针焊接头

对第二个8针头重复此操作,就完成了!

如果你跳过了,不要忘记回去焊接最后的6针头。如果你仍然需要把操纵杆焊接到位,你可以回到那个部分。

完成的焊点

完成所有组件的焊接后,您的电路板将如下所示:

所有针脚焊接

那块红色的印刷电路板看起来不是很刺眼吗?

现在是时候重新检查一下你所有的焊接并解决所有的问题了:

  • 所有的关节看起来都有光泽和火山形状吗?
  • 你是否有任何“短路”或“桥”在接头之间,你意外地连接两个接头与焊接?退房焊接指南寻求避免这些问题的建议。

不要不过,这很麻烦,因为如果可能,应避免重新加热和移动接头。

完成屏蔽

一旦你完成了你的盾牌,它应该是这样的。

完成屏蔽

当你准备好了,把盾牌堆在阿杜诺的上面!

已完成的盾牌堆叠在Arduino上

现在是时候让你的操纵杆护罩控制一些东西了!

Arduino示例:Shield

硬件连接

对于本教程的范围,我们将集中在前两个示例中,阅读使用护罩的操纵杆和按钮。

叠放在Arduino上的操纵杆护罩的摩擦图

如果你有操纵杆分接头,只要所有东西都像屏蔽一样接线,并且使用代码中的管脚定义作为参考,您仍然可以遵循。也,如果您有其他硬件,如压电蜂鸣器或串行启用的LCD,可以查看其他示例。

Arduino示例代码

操纵杆护罩提供简单的模拟输入,以及四个单独的按钮和操纵杆下方的一个按钮。操纵杆可用于控制屏幕上的输出,如旋律或像素。按钮可用于导航或游戏控制。如果要直接跳到示例草图中,从github repo下载并解压示例以深入了解。

  • Joystickarduino基本示例.ino-在控制台上打印操纵杆值和按钮。
  • Joystickarduino中间示例.ino-此代码与基本代码的作用相同,但在操纵杆上包含更多的位置。
  • 欢乐音乐控制.ino-用操纵杆和压电蜂鸣器控制旋律和节奏。
  • 亚博官网sparkfunjoystickshieldsamplesketch.ino公司-演示视频中的示例,用于支持串行的LCD。

让我们看看Github回购的三个示例中的两个。

基本实例

下载示例后,打开Joystickarduino基本示例.ino草图,选择Arduino/Genuino乌诺作为板上枚举的板和COM端口,点击上传按钮。打开串行监视器九千六百波特和测试出操纵杆护罩,观察操纵杆和按钮的行为。

拇指操纵手柄护罩原始输出

如果你一直跟着教程走,输出看起来与接线板示例.分接头和护罩有两种不同。一个明显的区别是输出。由于增加了四个按钮,每行有更多的值。如果没有按下按钮,它们将读作1。如果按下按钮,它们将读取为0。

第二个区别更微妙。操纵杆的方向旋转90度。“垂直”位置以X轴当“水平”被引用为Y轴“。输出指示值在520左右时操纵杆不移动。将操纵杆向上移动至“AREF”销,操纵杆将读取X轴的相同值,而Y轴组件将跳转到1023。顺时针向右移动,X轴将读取约0的值,而Y轴组件将再次位于约520的静止值。当操纵杆向下移动时,您会注意到X轴将再次位于其静止值,而Y轴组件将降至0。向左移动操纵杆,您会注意到X轴组件跳到1023,而Y轴组件则回到其静止值。最后,按下操纵杆时,选择按钮将显示为0。

中间示例

打开Joystickarduino中间示例.ino草图,选择Arduino/Genuino乌诺作为板上枚举的板和COM端口,点击上传按钮。以9600波特的速度打开串行监视器并测试操纵杆护罩,以观察操纵杆和按钮的行为。

拇指操纵手柄护罩未加工

再一次,您将注意到原始输出与基本示例相同。然而,还有一行指示操纵手柄的位置。代码有点复杂嵌套的如果声明检查操纵杆的位置。代码将位置分解为9个位置:

  • 中心
  • 向上的
  • 右上
  • 正确的
  • 右下
  • 向下
  • 左下
  • 左边
  • 左上

需要注意的代码

一旦你装配好防护罩,您可以开始更改示例代码,使操纵杆执行您的出价。下面是一些关于代码的深入解释。

如何找到操纵杆的当前位置?

操纵手柄的位置由操纵手柄中的两个电位计计算得出。操纵杆可以二维移动,通常表示X和Y坐标,但可以表示任何二维量。要读取电位计,我们使用类比读数()函数,返回从0到1023的数字。我们需要为功能提供一个模拟管脚编号-对于操纵杆护罩,X位置从模拟管脚0读取,Y位置从模拟管脚1读取:

语言:cserial.println(analogread(0));//打印当前X位置序列.println(analogread(1));//打印当前Y位置

这是一种很好的技术——因为它明确了您的意图——对运行草图时不会改变的值使用“常量”。考虑到这一点,以下草图片段为所用的模拟管脚设置常量,并将当前X和Y位置打印到串行控制台:

语言:cconst int pin_analyc_x=0;const int pin_analyc_y=1;void setup()serial.begin(9600);void loop()serial.print(“x”);串行打印(模拟读取(Pin_Analog_x));serial.print(“”);序列号打印(“Y”);串行打印(模拟读取(Pin_Analog_y));serial.print(“”);serial.println();

如何找到操纵杆的当前方向?

使用X和Y位置的值来确定操纵杆是否在8个方向(即起来,马上,正确的,右下,下来,左下角,左,左上)。

因为我们知道每个维度的值将在0到1023之间,所以您可能会期望中心值大约为511或512,但由于操纵手柄是物理设备,实际值不太可能是如此精确。如果我们选择了错误的值,我们会发现我们的操纵杆会被检测到朝着某个特定方向移动,即使它是居中的。

为了解决这个问题,我们指定了两个“阈值”值,并考虑在该范围内的任何值都应被视为“居中”:

语言:bash

根据操纵杆的不同,您选择的阈值可能不同。我们在代码中将这些值指定为常量:

语言:cconst int x_threshold_low=505;const int x_threshold_high=515;const int y_threshold_low=500;const int y_threshold_high=510;

下一步,我们要将每个维度的值从0到1023的位置范围映射到-1到1的方向值。对于X,尺寸-1表示向左移动,0表示X维度中未移动,1表示向右移动。对于Y尺寸-1意味着向下移动,0表示Y维度中未移动,1表示向上移动。

我们首先将每个维度的方向设置为0(“居中”),然后使用如果/其他用于检查维度中的位置值是否高于或低于阈值的语句:

语言:cx _方向=0;y _方向=0;x _位置=肛门(pin _模拟_x);y _位置=肛门(pin _模拟_y);if(x _位置>x _阈值_高);x _方向=1;;else if(x _位置<x _阈值U低);x U方向=1;;if(y _位置>y _阈值U高);y _方向=1;;else if(y _位置<y _阈值_阈值_阈值_阈值_阈值U高);if(低)Y轴方向=-1;

Arduino提供了MAP()在理论上我们可以使用的函数如果/其他但是由于中心问题的存在,这个方法很复杂,所以我们在这里不考虑这种方法。

正如您在下一个完整的示例中看到的,然后我们使用如果/其他打印方向的语句-可以修改此示例以执行所需的任何操作:

语言:cconst byte pin_analyc_x=0;const byte pin_analyc_y=1;const int x_threshold_low=505;const int x_threshold_high=515;const int y_threshold_low=500;const int y_threshold_high=510;int x_position;int y_position;int x_direction;int y_direction;void setup()serial.begin(9600);void loop()x_direction=0;Y轴方向=0;x_位置=模拟读数(pin_模拟_x);Y_位置=模拟读取(Pin_Analog_Y);如果(x_位置>x_阈值_高)x_方向=1;}否则,如果(x_位置<x_阈值_低)x_方向=-1;}如果(y_位置>y_阈值_高)y_方向=1;}否则,如果(y_位置<y_阈值_低)y_方向=-1;}if(x_direction=-1)if(y_direction=-1)serial.println(“左下”);}否则,如果(y_direction==0)serial.println(“left”);}else//y_direction==1 serial.println(“左上”);}}else if(x_direction==0)if(y_direction==1)serial.println(“down”);}否则,如果(y_direction==0)serial.println(“centraled”);}else//y_direction==1 serial.println(“up”);}}else//x_direction==1 if(y_direction=-1)serial.println(“right down”);}否则,如果(y_direction==0)serial.println(“right”);}else//y_direction==1 serial.println(“right up”);} }

如何设置Arduino,以便知道何时按下操纵杆护罩上的按钮?

在你知道屏蔽上的按钮是否被按下之前,您需要设置Arduino来识别按钮。毫不奇怪,您将在中执行此设置…设置()功能!

第一,我们为与每个按钮关联的Arduino管脚定义常量:

语言:C//按下操纵杆时触发选择按钮const byte pin_button_select=2;const byte pin_button_right=3;const byte pin_button_up=4;const byte pin_button_down=5;const byte pin_button_left=6;

如果您在注意到之前使用过按钮开关,通常需要一个电阻来检测未按下按钮时的已知电压。为了减少所需零件的数量,本屏蔽设计为不需要在屏蔽上安装电阻。你在想自己吗?如果按钮需要电阻,而屏蔽没有电阻,我们如何才能使屏蔽工作?“?如果你不这么想,那么你可能会跳过这一点。(如果你想的话)我真的很饿“也许是时候放下电子设备,买点食物了。”

事实证明,你的Arduino实际上有内部电阻连接到微控制器内部的管脚上。为了使用内部电阻,我们需要启用内部上拉电阻器“。如果你觉得这样的话”吊起起起起重臂,解开主撑。“然后我可以解释更多:

当“上拉“电阻器与按钮相连,这意味着未按下按钮时的电压水平将很高,因为电阻器”将电压水平拉高“当按钮未按下时,变为高。在典型的Arduino上,高电压为5伏。当按下按钮时,由于针脚和接地之间的电阻小于针脚和5伏之间的电阻,因此针脚的读数将变低。

要启用管脚的上拉电阻器,首先将管脚设置为输入,然后启用上拉:

语言:cpinmode(pin_按钮_右,输入插拔);

如果你从字面上看的话,启用下拉功能的实际代码没有任何意义,但这就是它的工作方式。

除了记住一个未按下的按钮会用上拉电阻读得很高之外,一个按下的按钮读得很低,你不需要记住或理解其他细节。

为了将每个针脚配置为输入并启用上拉电阻,我们使用以下代码:

语言:cvoid setup()/././././/。PinMode(Pin_按钮_右,输入插拔);PinMode(Pin_按钮_左,输入插拔);PinMode(Pin_按钮向上,输入插拔);PinMode(Pin_按钮_向下,输入插拔);PinMode(Pin_按钮\选择,输入-上拉);}

请参阅下一节了解如何读取按钮是否被按下。亚博在线娱乐官网

我如何知道何时按下操纵杆护罩上的按钮?

一旦设置好Arduino识别按钮(见上文),您就可以判断是否使用数字读入()功能。当读取值低时,按下按钮;当读取值高时,不按下按钮。

语言:CIF(数字读取(pin_button_left)==low)//按钮按下否则//按钮未按下

以下完整示例将每个按钮的状态和操纵杆的值打印到Arduino串行控制台:

语言:C//存储与每个输入相关的Arduino管脚//按下操纵杆时触发选择按钮const byte管脚_按钮_select=2;const byte pin_button_right=3;const byte pin_button_up=4;const byte pin_button_down=5;const byte pin_button_left=6;const byte pin_analogular_x=0;const byte pin_analogular_y=1;void setup()serial.begin(9600);PinMode(Pin_按钮_右,输入);数字写入(Pin_按钮_右,高);PinMode(Pin_按钮_左,输入);数字写入(Pin_按钮_左,高);PinMode(Pin_按钮向上,输入);数字写入(Pin_按钮向上,高);PinMode(Pin_按钮_向下,输入);数字写入(Pin_按钮向下,高);PinMode(Pin_按钮\选择,输入);数字写入(Pin_按钮\选择,高);}void loop()serial.print(“l:”);串行打印(DigitalRead(Pin_按钮_Left));serial.print(“”);序列号打印(“R”);串行打印(数字读取(Pin_按钮_右));serial.print(“”);serial.print(“U:”);串行打印(DigitalRead(Pin_按钮_-up));serial.print(“”);serial.print(“d:”);串行打印(数字读取(Pin_按钮_向下));serial.print(“”);serial.print(“x:”);串行打印(模拟读取(Pin_Analog_x));serial.print(“”);序列号打印(“Y”);串行打印(模拟读取(Pin_Analog_y));serial.print(“”);serial.print(“s:”);串行打印(数字读取(Pin_按钮_选择));serial.print(“”);serial.println();

处理库

注:处理是一种软件,它可以实现数据的可视化表示,除此之外。如果你以前从未处理过处理,我们建议您也查看Arduino到处理教程.按照下面的按钮继续下载并安装处理IDE 2.2.1版。以下示例用于处理IDE v2,因此在处理IDE v3时可能遇到问题。

下载处理IDE 2.2.1

要安装处理库,您需要转到处理Arduino接口页。

有一个链接可以在它说“之后接收最新版本”用于处理v2.0和v3.0的库“从它Github存储库.

用于处理v2.0和v3.0的库:最新版本(11月7日更新)2016)

点击链接下载处理-arduino.zip然后解压到计算机上的位置。安装此库的过程类似于手动安装Arduino库。打开一个新窗口并找到“处理库”文件夹。它应该看起来像…\文档\处理\库“。单击标签为的未压缩文件夹处理Arduino.然后移动“阿尔杜诺“文件夹进入处理图书馆文件夹。

标准硬度

我们还需要上传标准Firmata.ino使用Arduino和Thumb操纵杆护罩进行处理之前的示例代码。幸运的是,这已经在Arduino IDE中了。打开Arduino IDE并前往文件>实例>菲尔玛塔>标准Firmata.ino草图,上传到Arduino板。记住选择Arduino/Genuino乌诺作为板和COM端口在您的计算机上传之前。

处理示例:屏蔽

如果你还没有,从Github repo下载并解压示例,以使用操纵杆护罩深入到处理示例中。

  • Joystick处理基础示例.pde-与Arduino和输入的基本处理集成。
  • Joystick处理artist.pde-在窗户上画画。

如果你有操纵杆分接头,只要所有的东西都像屏蔽一样接线,并且使用代码中的管脚定义作为参考,您仍然可以遵循。如果不是,您的功能有限。

基本实例

我们假设你的阿杜诺标准Firmata.ino加载到ATMEGA328P中的草图。下载示例后,打开Joystick处理基础示例.pde速写处理IDE 2.2.1版.您可能需要从文件>正常开放使Arduino IDE意外打开文件。把你的操纵杆护罩叠起来,把Arduino连接到你的电脑上,点击运行按钮执行处理草图。

点击运行按钮进行处理

如果没有为COM端口调整数组,您可能会收到一个错误,指示代码无法运行。

由于COM端口选择导致处理错误

在安装库时记得前面的注释吗?好,您需要正确调整COM端口才能连接到您的Arduino。如果在Arduino IDE中上载时还记得COM端口,它应该列在处理IDE底部的控制台中。在这种情况下,列出的COM端口为:

语言:bashcom4 com5 com6 com7 com8 com9 com10 com11 com12

从左到右从0计算每个COM端口(就编程而言,不是用数学术语)。在这种情况下,上载时,Arduino枚举为com8,因此它应该在数组的第4个元素中。

返回到处理中的代码并调整在数组中,它说:

language:c//我们假定arduino是列表中的第一个设备,//如果不是第一个设备,则需要更改“0”。arduino=new arduino(this,arduino.list()[0],57600);

到数组中的元素。在这种情况下,应该是.

//我们假设Arduino是列表中的第一个设备,//如果不是第一个需要更改“0”的设备,则Arduino=new Arduino(this,arduino.list()[4],57600);

现在你准备好了,再次按下“运行”按钮。在Arduino初始化之后,出现一个空白的显示窗口。在代码中,我们没有画出任何东西,所以应该是空白的。您还会注意到底部的输出与Arduino IDE的串行监视器中显示的输出类似。移动操纵杆和按钮将按预期调整值。

处理时运行的基本示例

艺术家实例

再一次,我们假设你的阿杜诺标准Firmata.ino加载到ATMEGA328P中的草图。下载示例后,打开joystick处理artistexample.pde速写处理IDE 2.2.1版.您可能需要从文件>正常开放使Arduino IDE意外打开文件。调整数组中的COM端口到Arduino枚举的COM端口。把你的操纵杆护罩叠起来,把Arduino连接到你的电脑上,点击运行按钮执行处理草图。

将弹出一个显示窗口,并从窗口中心开始绘制。按向上和向下按钮将调整色调。点击左键和右键可调节亮度。转动操纵杆开始喷漆。厚的,粗体线,按下操纵杆。当你释放了你内心的艺术家,同时单击左右按钮进行保存。一*PNG文件将截取您的作品的屏幕截图,并将其保存在与处理草图相同的文件夹中!

艺术家处理素描的例子

你可能已经注意到,画笔有一个自己的想法,就像上面显示的图像。这是由于“的代码中设置的默认阈值”定位法“存在”.取决于制造公差,这些值可能会有所不同。如前面的突破和护盾示例所述,当操纵杆位于中间时,您需要观察读数。使用这些值,在再次运行代码之前,您需要调整代码中的值,以防止画笔漂移。尝试通过调整探索方法定位法在代码的顶部,或.

语言:c//您可以选择多种方法来确定//操纵杆位置和屏幕上绘图点位置之间的关系。将“位置”方法更改为等于0,1,2或3尝试//不同的变化。//请参阅下面代码中的注释,了解每个方法的工作原理。final int position_method=0;

资源和进一步发展

既然你已经成功地启动和运行了操纵杆,是时候把它纳入你自己的项目了!亚博官网

更多信息,查看以下资源:

如果您正在寻找使用Javascript和Johnny Five的示例代码,查看链接到操纵杆类.

下一个项目需要一些灵感吗?亚博官网查看以下一些相关教程:

獾背:游戏附加套件

制作一个突破克隆与獾背游戏附加工具包。

无线操纵杆连接指南

Sparkfun无线操纵杆套件的连接指南。亚博官网

串行控制电机驱动器连接指南

串行控制电机驱动器的连接指南
新!

QWIIC操纵杆连接指南

寻找一个简单的方法来实现你的下一个Arduino或Raspberry PI项目的操纵杆?亚博官网本连接指南将引导您使用Qwiic操纵杆,在红板Qwiic上使用Arduino IDE,在Raspberry PI上使用python。

如果你不知道如何使用操纵杆,签出以下视频:


亚博在线娱乐官网学习.spa亚博官网rkfun.comγCC BSA SA 3| 亚博官网Sparkfun电子公司科罗拉多州

关于超显示你应该知道的一切 液体洗涤器 https://www.亚博官网sparkfun.com/users/9564 urn:uuid:814418cd-95af-9771-b601-a59f7626e7b2 2019年2月20日00:00:00-07:00

关于超显示你应该知道的一切亚博在线娱乐官网learn.亚博官网sparkfun.com教程

可在线访问:http://sfe.io/t863

介绍

没有人想重新发明轮子,正确的?每次我们为新产品编写另一个(稍有不同的)图形库时,我们都会有这样的感觉,比如RGB OLED Breakout和EPAPER显示器。更不用说必须为每个产品使用特定的代码,这使得在项目中开始使用新的显示非常困难。亚博官网我们的超显示库旨在结束这一切-使它很容易添加对新显示的支持和使用!亚博国际官网

本教程的目标是让您了解如何使用超显示,从最基本的到能够扩展库。坚持学习如何轻松使用,亚博在线娱乐官网强大的,以及灵活的新工具!

我们在各个章节中讨论的主题将从基础知识一路发展到图书馆最先进的使用。你可以随意阅读你需要的部分,并浏览其他部分-你可以随时回来了解更多。

教程部分

Mandelbrot集分形显示与超显示

什么是超显示?

创建Hyperdisplay时考虑了以下目标:

  • 标准化图形库,以便相同的代码可用于任何显示
  • 减少增加对新显示技术支持的重复工作亚博国际官网
  • 使用可在不需要时简化的通用接口
  • 使创建图形用户界面更容易

这些目标是通过模块化实现的,绘图功能中的默认参数,Windows功能,以及缓冲绘图模式。

模块性

超显示模块化实现了标准化和易扩展性。共有三个级别的代码可以协同工作。

  • 顶层:超显示
    • 超显示本身是顶级的,它包含标准化的绘图界面。这包括所有的图纸,窗口,和缓冲选项。
    • 一些功能,像这样画一个像素,留下作为纯虚拟表明他们必须由下级执行
    • 其余的函数都是根据这些纯虚拟函数定义的,这样只要它们被实现,整个超显示套件就可以使用。
    • 有一些可选功能可以重新编写,为特定的显示提供额外的速度或附加功能。
  • 中级:驾驶员,集成电路
    • 仅仅通过实现所需的功能,就可以在这个级别上生成一个全功能的超显示驱动程序。
    • 通常在这个层次上,我们将表示用于运行整个显示类型的集成电路的内部工作。如用于控制TFT液晶屏的ILI9163C
  • 底层:特定产品
    • 基于中间层的驱动程序
    • 表示特定的接口类型(例如SPI与VIC与并行
    • 表示显示器的物理尺寸

这正是您目前所需要了解的关于模块化的内容。在本教程的最后,我们将介绍如何创建自己的驱动程序。

默认参数

简单的界面有助于避免混淆。不幸的是,需要一系列可能的功能,比如绘制矩形()DrawThickRectangle()。DrawThickFilledinRectangle()。--你怎么知道从哪里开始?在超级显示中,我们使用C++中的默认参数,它允许您只使用所需的信息来使用每个绘图函数。作为图形库的核心,我们将分两部分介绍绘图功能:

  • 简单地说,只有足够的信息来使用你选择的颜色
    • 例如。线X0Y0X1Y1宽度颜色
  • 完全复杂,使用重复的颜色模式和其他参数
    • 例如。线X0Y0X1Y1宽度颜色颜色周期长度开始颜色偏移反向梯度

窗口功能和缓冲绘图

随着超显示的创建,有机会添加其他微控制器图形库中缺少的内容;也就是说,能够像在计算机上一样绘制“窗口”。当不需要考虑内存约束时,可以选择缓冲绘图。现在更容易创建gui,动画,而且,有了创造力,即使是半透明的分层图像。

现在继续阅读了解如何安装Hyp亚博在线娱乐官网erdisplay并开始!

安装HyperDisplay

注:此示例假定您正在桌面上使用最新版本的Arduino IDE。如果这是你第一次使用Arduino,请回顾我们的教程 安装Arduino IDE。如果您以前没有安装过Arduino库,请查看我们的 安装指南。

安装超显示库

记住,超显示是一个三层蛋糕,你需要这三层来让它做任何有用的事情。顶层始终是主要的超显示库,在Arduino图书馆管理器中提供。在Arduino区,导航到草图>包含库>管理库.然后在搜索框中,一旦缩小搜索范围,开始搜索“SparkFu亚博官网n超显示”,选择Sparkfun超亚博官网显示库并单击“安装”。

通过库管理器安装SparkFu亚博官网n超显示库

否则,您可以手动下载库。引导到Github存储库并将存储库作为zip文件夹下载(或单击下面的链接):

要通过zip文件夹手动安装库,阿尔杜诺导航到草图>包含库>添加.zip库,并选择您刚下载的zip文件夹。

安装超显示兼容库

中间层将是一个超显示兼容库,设计用于运行显示器的实际芯片。此部分将特定于您想要使用的显示,因此您应该使用您可以从产品页面获得的示例草图中的库管理器链接。

安装驱动程序特定库

最后一层特定于您使用的确切产品,因为特定的接口(例如SPI与VIc)即使是同一个驱动IC,屏幕的特定分辨率也可能不同。再一次,从正在使用的显示器的产品页获取此库。

一旦你知道在哪里找到所有需要的层,查看我们的指南安装Arduino库建立起来。

安装Arduino库

1月11日,二千零一十三

如何安装自定义Arduino库?这很容易!本教程将介绍如何使用Arduino库管理器安装Arduino库。对于未与Arduino IDE链接的库,我们还将继续手动安装Arduino库。

安装好所有的东西之后,您可以通过从底层库中选择一个示例草图并尝试编译它来确保一切正常。当一切都在工作时,进入下一节,开始学习绘图功能的基本用法。亚博在线娱乐官网

基本绘图功能

避免严重的模糊性最好从Hyperdisplay开始,一次一点。您需要了解的前两件事情是如何处理颜色以及如何以最小形式使用绘图函数。

超显示中的颜色

显示器进来了,好,所有形状和颜色!从单色LCD和OLED到全彩色TFT和LED显示屏,更不用说独特的三色EPAPER显示屏,有很多事情要做。因为Hyperdisplay的设计是为了适应所有这些显示以及更多,我们必须考虑如何表示用户可能选择的所有颜色。我们如何解决这个问题?用三个字节表示红色,绿色,每一个像素的蓝色通道肯定足以代表当前显示技术所能显示的所有颜色,但对于像点阵显示器这样的东西来说,它将是多余的,因为它可以在同一个空间中存储价值24像素的信息。

解决方案是将颜色的表示保留到硬件特定的层。仍然,顶级的超显示功能至少需要知道在哪里可以找到关于颜色的信息。这自然会导致在HD函数中使用指针作为颜色参数。代码中的情况如下:

语言:c//制作Hawrdware特定颜色变量的方法hwcolor mycolor0=red;//使用预定义常量或另一个colorHwColor MyColor1=0x01;//指定单字节值(如果适用)hwcolor myclor2=0x00,0x00,…,0x00 };指定结构中每个字节的值(如果适用)hwcolor mycollor3=converterFunctionRGB(redval,格林瓦尔蓝色的;//使用返回基于输入的所需颜色的函数//使您的颜色成为超显示颜色指针颜色_t myhdcolor=(color_t)&myclorn;//使用“&”获取颜色在内存中的位置,并且(颜色)将该位置强制转换为HD颜色类型

简单绘图用法

在最简单的情况下,要画一些东西,你需要知道在哪里画,用什么颜色。可以绘制单个像素,X线或Y线,点对点线,矩形,圈子,甚至是多边形!你也可以在整个窗口中用某种颜色一下子就填满。

坐标是零索引的,因此当给定方向上有n个像素时,第一个像素是数字0(在x或y方向上),而屏幕上的最后一个像素是n-1。坐标的变量类型是'hd_extent_t',它被指定为一个浮点型,因此您输入的任何数字都可以工作。

以下是您可以使用的基本功能:

  • 象素X0Y0颜色
    • 将像素设置为(X0Y0)到存在的颜色颜色
  • 构造线X0Y0长度颜色
    • 从中绘制线条(X0Y0X0+(长度- 1)Y0颜色
  • 尤林X0Y0长度颜色
    • 从中绘制线条(X0Y0X0Y0+(长度- 1)颜色
  • 线X0Y0X1Y1宽度颜色
    • 从…开始排队(X0Y0X1Y1颜色宽度
  • 矩形X0Y0X1Y1填满颜色
    • 绘制一个角位于的矩形(X0Y0)(X0Y1)(X1Y0)和(X1Y1)可以选择填满在(当为“真”)中颜色
  • 圆圈X0Y0半径填满颜色
    • 绘制一个居中的圆(X0Y0半径可以选择填满具有颜色
  • 多边形x[]y[]纽曼斯宽度颜色
    • 连接纽曼斯用点纽曼斯 线S为闭合形状宽度颜色.x[]y[]应该是表示坐标的浮点数组
  • 填充窗颜色
    • 填充整个当前窗口颜色

感谢C++中的自动浇铸,您将能够在XY参数,除了在“polygon”函数中,在这种情况下,它们需要是HD-ExtEXT.

这些函数还支持默认值-例如亚博国际官网颜色不必指定。如果被排除在外,HyperDisplay将为窗口使用“当前”颜色,该颜色可以通过以下方式更改:

  • 设置当前窗口颜色序列(颜色

此外,这个填满参数将默认为“false”,并且宽度参数将默认为“1”。

TFT示例的基本绘图输出

设置当前窗口颜色的函数提示下面将讨论的一些更高级的功能,特别是为什么我们说“颜色序列”而不是“颜色”。查看下一节了解!

高级绘图功能

高级超显示绘图功能实际上与您已经知道的功能相同,但这次握的手少了!

颜色循环

在上一节中,我们只使用一种颜色来绘制图像。高清然而,亚博国际官网支持在所有绘图功能中重复“颜色循环”。这使得在不使用大量内存的情况下很容易创建重复模式。创建颜色序列时,有三件事需要指定。

  • 连续数组-这是一个颜色类型的数组(由正在使用的硬件定义),其中数据参数指向第一个元素
  • 颜色周期长度-颜色类型对象数的循环长度
  • 开始颜色偏移-从第一个对象开始的偏移量

在颜色周期规范之后,可以调整方向(和,对于矩形,轴对齐)通过在除单个像素之外的每个函数中使用布尔参数。下面是带变量类型的完整声明。

  • 无效 象素HD-ExtEXT X0HD-ExtEXT Y0科罗拉特 数据= NULL,HDL染色机 颜色周期长度=1,HDL染色机 开始颜色偏移=0);

  • 无效 构造线HD-ExtEXT X0HD-ExtEXT Y0HD-ExtEXT 伦恩科罗拉特 数据= NULL,HDL染色机 颜色周期长度=1,HDL染色机 开始颜色偏移=0,布尔 哥尔夫=假);

  • 无效 尤林HD-ExtEXT X0HD-ExtEXT Y0HD-ExtEXT 伦恩科罗拉特 数据= NULL,HDL染色机 颜色周期长度=1,HDL染色机 开始颜色偏移=0,布尔 古普=假);

  • 无效 矩形HD-ExtEXT X0HD-ExtEXT Y0HD-ExtEXT X1HD-ExtEXT Y1布尔 填满= FALSE,科罗拉特 数据= NULL,HDL染色机 颜色周期长度=1,HDL染色机 开始颜色偏移=0,布尔 反向梯度= FALSE,布尔 垂直梯度=假);
  • 无效 填充射线HD-ExtEXT X0HD-ExtEXT Y0HD-ExtEXT X1HD-ExtEXT Y1科罗拉特数据= NULL,HD-PixelsSt 纽马克=0,布尔 维生素H=假);
  • 无效 填充窗科罗拉特 颜色= NULL,HDL染色机 颜色周期长度=1,HDL染色机 开始颜色偏移=0);

  • UIT1616 线HD-ExtEXT X0HD-ExtEXT Y0HD-ExtEXT X1HD-ExtEXT Y1UIT1616 宽度=1,科罗拉特 数据= NULL,HDL染色机 颜色周期长度=1,HDL染色机 开始颜色偏移=0,布尔 反向梯度=假);

  • 无效 多边形HD-ExtEXT x[]HD-ExtEXT y[]UIT88T 纽曼斯UIT1616 宽度=1,科罗拉特 数据= NULL,HDL染色机 颜色周期长度=1,HDL染色机 开始颜色偏移=0,布尔 反向梯度=假);
  • 无效 圆圈HD-ExtEXT X0HD-ExtEXT Y0HD-ExtEXT 半径布尔 填满= FALSE,科罗拉特 数据= NULL,HDL染色机 颜色周期长度=1,HDL染色机 开始颜色偏移=0,布尔 反向梯度=假);

尽情尝试这些功能,看看你能用它们做些什么!

来自TFT示例的高级绘图输出

可以,所以,超显示一开始似乎很容易使用,但也很有能力!准备好叫停了吗?不是很快——我们仍然可以研究一下窗口和缓冲的使用,以及如何为自己的显示器创建超显示驱动程序的指南。所以吃点小吃,然后进入下一个部分!

使用Windows

如果您只尝试了目前为止已经呈现的函数(并且还没有在源代码中进行任何超级调查),那么您只需要将像素放在物理屏幕上它们应该放在的地方……好吧,我来这里是想告诉你,这不一定是那样的!

当我们设计超显示时,我们想让它比其他小微控制器的选择更好。有一件事一直困扰着我,那就是必须为x和y坐标编写复杂的表达式来解释屏幕上的其他内容,尤其是它们可能移动的时候。解决方案是允许在窗口中绘制内容。因此,任何需要相对于另一个元素保持在一个位置的元素都可以被分组到一个窗口中,然后那个窗户就可以很容易地移动了。

使用绘图功能时,您正在绘制到当前选定的显示窗口中,如果保持不变,则该窗口相当于显示的物理硬件,因此HD与任何其他图形库类似。

窗口信息结构

这个温德斯尼福特类型包含有关位置的信息,文本打印,颜色序列,还有记忆。

语言:c typedef struct window_info_hd_hw_extent_t xmin;//fyi window min/max使用参考hd_hw_extent_t xmax的硬件框架;硬盘驱动器高密度聚乙烯;高清光标;//光标当前在窗口坐标hd_-extent_-cursory中的位置;硬盘范围xreset;硬盘范围设置;字符信息最后一个字符;彩色当前序列数据;//用作默认颜色序列的数据hd_colors_t currentcolorcyclelength;hd_colors_t currentcoloroffset;布尔缓冲区;//表示缓冲或直接模式(默认为直接)颜色数据;高清像素,数字像素;动臂;W.//用于在显示器上放置对象的窗口信息结构

窗口位置变量

位置变量是根据显示器的物理硬件坐标来指定的-这就是您如何设置窗口的大小和位置。当窗口与屏幕尺寸不匹配时,它们会将绘图限制在其范围内,因此可以将负值或大值作为绘图函数的参数显示。此外,允许窗口从屏幕上消失,在这种情况下,从硬件中提取的像素将不会显示(因此无需担心硬件访问不正确)。窗口的位置由以下内容指定:

  • Xmin
  • XMAX
  • 伊敏
  • YMAX

文本跟踪

列表中的下一个是用于跟踪文本的五个参数。这些值在窗口坐标中,因此(0,0)始终位于窗口的左上角,不管窗户在屏幕上的什么地方。变量'cursorx'和'cursory'跟踪下一个字符的打印位置。另一方面,“xreset”和“yreset”跟踪重置后光标的位置。最后,“lastcharacter”用于跟踪前一个字符是什么-当前它用于在换行符需要环绕窗口时避免执行两个换行。

  • 库罗索
  • 粗略的
  • X复位
  • YRead
  • 最后字符

  • 你可以使用设置文本游标因特32 X0因特32 Y0温德斯尼福特*窗口= NULL);修改给定窗口的当前光标位置(默认为当前窗口)。

  • 你可以使用重新设置文本游标温德斯尼福特*窗口= NULL);将光标放回重置位置。

默认颜色循环

窗口信息结构还跟踪绘图函数未指定颜色时要使用的默认颜色周期。这三个变量与可以传递到绘图函数中的三个变量相同:

  • 当前序列数据
  • 当前颜色周期长度
  • 当前颜色偏移

  • 设置窗口颜色序列温德斯尼福特*科罗拉特 数据= NULL,HDL染色机 颜色周期长度=1,HDL染色机 开始颜色偏移=0);用于设置给定窗口的当前颜色周期。和

  • 设置当前窗口颜色序列科罗拉特 数据= NULL,HDL染色机 颜色周期长度=1,HDL染色机 开始颜色偏移=0);将为当前窗口设置当前颜色周期。

缓冲

窗口信息结构的最后一个任务是保存关于缓冲的信息,我们将在下一节中讨论,所以请耐心等待。


了解HyperDisplay的W亚博在线娱乐官网indows功能的最好方法是尝试一下,但这里有一份不完整的清单,列出了你可以做的事情:

  • 使用默认颜色简化绘图
  • 创建复杂排列的简单动画
  • 将文本覆盖到图像上
  • 创建更简单的GUI

文字

hyperdisplay有一个默认的字体,但像其他一切在高清,它是完全由您自定义!当您调用一个“打印”函数(它们就像普通的Arduino打印函数一样)时,它反过来为每个由超显示处理的字符调用一个“写入”函数。在“write()”中,超显示使用查尔斯因福特对象来确定下一步要做什么,比如表现人物,跳过它,或者换行。另外,对象描述了如何构造字符。要获取字符信息结构的信息,hd使用一个名为“getcharinfo()”的函数。

  • 事实上的无效 获得信息UIT88T 性格查尔斯因福特*普查尔

通过重写此函数,可以为可能请求的任何字符打印出任何符号,只要符号可以在矩形区域内绘制。要实现此功能,您需要填写查尔斯因福特“pchar”指针指向的具有所需信息的对象。

创建自己字体的完整示例尚不存在,但将来可能会添加。如果你感到勇敢,我们当然会感谢超显示报告

语言:ctypedef结构字符信息颜色数据;//用于填充字符框hd_font_extent_t*xloc的数据;//相对于字符区hd_font_extent_t*yloc左上角的x位置数据;//y相对于字符区hd_font_extent_t xdim左上角的位置数据;//xloc hd_font_extent_t ydim的最大值;//yloc的最大值-对于导致新行hd_pixels_t numpixels的字符,还要向下移动的像素数;//pdata指向bool show的颜色类型数;//是否实际显示字符bool causesnewline;//这表示给定的chracter是否要引起换行符char_info_t;//用于在窗口中放置像素的字符信息结构

TFT示例的窗口化绘图输出

可以,窗户很整洁,但是他们对画在里面的东西没有任何记忆,这真是一件麻烦事,正确的?实际上他们可以!继续读下去,找出那个。

缓冲

内存是微控制器和嵌入式系统中一个棘手的问题。特别是在最流行的ATMEGA328P上,您需要保存您可以保存的每一个字节的内存,因此,Hyperdisplay默认为在无缓冲模式下运行(在某些情况下,显示硬件需要一个缓冲区)。然而,以这种方式操作意味着您必须实时观察绘图操作。为了避免这种情况,还可以启用其他很酷的功能,例如(可能的)图层透明度,我们需要记录屏幕上的内容。这就是缓冲绘图模式发挥作用的地方。

幸运的是,在缓冲模式下运行非常简单!你所需要做的就是为你的缓冲区分配内存(足够大以容纳所有像素)。告诉缓冲窗口在哪里找到内存,并切换到缓冲模式。一旦进入缓冲模式,在调用“show()”之前,绘图函数不会出现在屏幕上。同时,数据将被重新路由到您提供的缓冲区。下面是该过程在代码中的外观:

语言:chwcolor_t smallwindowmem[32*64];//保留32*64像素的内存ind_info_t smallwindow;//创建windowsmallwindow.xmin=16;//设置参数以匹配缓冲区大小mallwindow.ymin=72;smallwindow.xmax=16+31;/看,16+0是一个像素,所以16+31实际上是32像素宽smallwindow.ymax=72+63;//这意味着64像素高。所以现在我们的小窗口可以填充32*64 pixelsmydisplay.pccurrentwindow=&small window;//将当前窗口切换到小窗口mydisplay.buffer();//将当前窗口设置为buffer modemydisplay.line(0,0,55、45);//在窗口上画一条线…//继续drawingMyDisplay.show();//显示conc处的所有更改

来自TFT示例的缓冲绘图输出

好吧,你已经快到达超级展示的顶峰了!再来一节,你将成为真正的大师1

派生自定义驱动程序

虽然您可能完全满足于使用超显示,希望像你这样的人能够增加对更多显示器的支持,无论是在传统的数字屏幕上,亚博国际官网还是在一些更具异国情调的媒体上(禅园打印机,有人吗?).最后一节应该给你一个关于存在的接口的概念,这就是我们最初创建超显示的全部原因。

为另一个显示添加HD亚博国际官网支持非常简单——您需要做的只是从超显示类派生一个子类并实现三个函数:

  • 构造函数
  • 在特定位置设置单个像素的函数。
  • 告诉hd下一个颜色类型在颜色循环中的位置的函数。

如果你想尝试一下,但没有显示器可以使用,那么试着制作一个虚拟屏幕,将X和O打印到串行监视器上。

简单的必需品。

类定义包含生成可实例化的HD子类所需的最小值,以及关于要做什么的评论,以及您可以做出的可选改进。因为类继承自HyperDisplay,所以您可以完全访问HD的所有功能。

language:cclass baremenderived:virtual public hyperdisplay//将hyperdisplay用作virtual将允许支持将来从hyperdisplay继承的I/O库private:p亚博国际官网rotected:public://constructor:at minimum pass in the size of the display/*x size:number of pixels in the x direction of the displayysize:显示Y方向的像素数*/bareminderived(uint16_t xsize,uint16_t ysize/*附加参数*/);//getoffsetcolor:允许超显示使用自定义颜色类型/*base:保存颜色数据的数组第一个字节的指针numPixels:函数应返回指向*/color_t getoffsetcolor(color_t base,uint32像素);//hwpixel:hyperdisplay实际更改屏幕的方法/*x0,y0:放置像素的x和y坐标。0,0是屏幕的左上角,x是水平的,y是垂直的数据:指向颜色数据存储位置的指针colorcyclelength:这表示在颜色指向的内存位置之后,有多少像素值的有效颜色数据连续存在。startcoloroffset:表示从颜色指针偏移多少像素,以达到要显示的实际颜色*/void hwpixel(hd_hw_extent_t x0,高清硬件扩展颜色数据=空,hd_colors_t colorcyclelength=1,hd_colors_t startcoloroffset=0);//附加硬件绘图功能/*除了HwPixel还有其他硬件绘图功能。默认情况下,它们已经使用hwpixel实现,因此不需要它们来开始绘制。但是,使用更有效的方法为您的特定硬件实现它们可以减少开销并加快绘图过程。在这些函数中,坐标X0,X1,Y0而y1始终与硬件屏幕相关。(0,0)是左上角的像素,是与颜色序列相关的变量(数据,颜色周期长度,和startcoloroffset)的含义始终与hwpixel中的含义相同。其他变量将在bareminimumDerivedClass.cpp*//void hwxline(uint16_t x0,UIT1616T Y0,UIT1616T LeN,彩色数据,uint16_t colorcyclelength=1,uint16_t startcoloroffset=0,bool goleft=假);//无效Hwyline(uint16_t x0,UIT1616T Y0,UIT1616T LeN,彩色数据,uint16_t colorcyclelength=1,uint16_t startcoloroffset=0,bool goup=假);//void hwrectangle(uint16_t x0,UIT1616T Y0,UIT1616T X1,UIT1616T Y1,彩色数据,bool filled=false,uint16_t colorcyclelength=1,uint16_t startcoloroffset=0,Bool GradientVertical=假,bool reversegradient=false);//void hwfillFromArray(uint16_t x0,UIT1616T Y0,UIT1616T X1,UIT1616T Y1,uint32像素,彩色数据;//用户的其他可选实现://===================================================//getcharinfo:您可以创建自定义字体,而不更改打印功能的工作方式/*character:要在屏幕上显示的字节大小的字符p char:指向需要填写p的有效char_info_t对象的指针eroperly用于给定的字符*///void getcharinfo(uint8_t character,字符信息;//写入:决定当有人调用baremenderived.print或baremenderived.println/*val:要显示的字节大小的字符值*//大小写(uint8_t val);};

简单必需品.cpp

此.cpp文件包含“baremenderived”类中声明的方法的模板。如果您填写这些方法,您将得到一个有效的超显示驱动程序。

language:c include“bareenecessary.h”//constructor:在显示器的大小中至少传递一次/*x size:在显示器的x方向上的像素数y size:在显示器的y方向上的像素数*注意:此符号允许您显式地说明当调用了派生类的构造函数。其他直接或虚拟基类也可以用相同语法的逗号分隔列表初始化-“最深”的基类列在第一个位置。*/Baremenderived::Baremenderived(uint16_t xsize,uint16_t ysize/*附加参数*/):超显示(xsize,ySead)AnotherVirtualBaseClass(参数),adDirectBaseClass(moreParams)*///在此处使用任何其他参数执行派生类的设置。//GetOffsetColor:允许超显示使用自定义颜色类型/*Base:指向保存颜色数据的数组第一个字节的指针numPixels:距函数应重新开始的像素数n指向*/color_t baremenderived::getoffsetcolor(color_t base,uint32_t numpixels)//需要此方法,以便您的颜色类型完全灵活-无论是电子墨水//显示器的三种颜色的枚举,还是24位颜色的字节结构,这完全取决于您以及显示器的工作方式。//此实现将取决于您选择存储颜色的方式,但是,有一种很好的方法可以作为参考:/此函数根据像素数和对象的_colormode//color_t pret=null返回偏移指针;//您的_color_type*ptemp=(您的_color_type*)基础;//这就是魔法。将基指针强制转换为颜色类型的指针,以允许指针算术//pret=(color_t)(ptemp+numpelexels);//像素数的偏移量。这将说明您的颜色类型占用的字节数//返回pret;//并返回偏移指针//hwpixel:hyperdisplay实际更改屏幕的方法/*x0,y0:放置像素的x和y坐标。0,0是屏幕的左上角,x是水平的,y是垂直的数据:指向颜色数据存储位置的指针colorcyclelength:这表示在颜色指向的内存位置之后,有多少像素值的有效颜色数据连续存在。startcoloroffset:表示从颜色指针偏移多少像素,以达到要显示的实际颜色*/void baremenderived::hwpixel(hd_hw_extent_t x0,高清硬件扩展彩色数据,HD颜色颜色周期长度,hd_colors_t startcoloroffset)//这里编写设置像素的代码。如何处理这些数据取决于您。这里有两个基本选项:/(1)直接写入显示RAM:如果您选择此选项,并且您的显示器支持它,那么这就是显示图像所需的全部功能。/(2)写入草稿空间:您可以使用此选项合成整个图像,然后在屏幕上同时显示所有图像。亚博国际官网//在这种情况下,您需要自己的函数,在适当的时间将所有信息实际获取到显示器。//其他硬件绘图函数/*除了HwPixel还有其他硬件绘图函数。默认情况下,它们已经使用hwpixel实现,因此不需要它们来开始绘制。但是,使用更有效的方法为您的特定硬件实现它们可以减少开销并加快绘图过程。在这些函数中,坐标X0,X1,Y0而y1始终与硬件屏幕相关。(0,0)是左上角的像素,是与颜色序列相关的变量(数据,颜色周期长度,和startcoloroffset)的含义始终与hwpixel中的含义相同。在bareminMinimumDerivedClass.cpp*//void baremenderived::hwxline(uint16_t x0,UIT1616T Y0,UIT1616T LeN,彩色数据,uint16_t colorcyclelength=1,uint16_t startcoloroffset=0,bool goleft=false)//void baremenderived::hwyline(uint16_t x0,UIT1616T Y0,UIT1616T LeN,彩色数据,uint16_t colorcyclelength=1,uint16_t startcoloroffset=0,bool goup=假);//void bareminderived::hwrectangle(uint16_t x0,UIT1616T Y0,UIT1616T X1,UIT1616T Y1,彩色数据,bool filled=false,uint16_t colorcyclelength=1,uint16_t startcoloroffset=0,Bool GradientVertical=假,bool reversegradient=false);//void bareminderived::hwFillFromArray(uint16_t x0,UIT1616T Y0,UIT1616T X1,UIT1616T Y1,uint32像素,彩色数据;//用户的其他可选实现://===================================================//getcharinfo:您可以创建自定义字体,而不更改打印功能的工作方式/*character:要在屏幕上显示的字节大小的字符pchar:指向有效char\u info\u t对象的指针,该对象需要为giv填充perlyen character*///void getcharinfo(uint8_t character,字符信息;//写入:决定当有人调用baremenderived.print或baremenderived.println/*val:要显示的字节大小的字符值*//大小写(uint8_t val);

素描

此草图创建派生显示的实例。你可以用它来看看是否一切顺利。

语言:C/*超显示示例1:简单必需品作者:Owen Lye Sparkfun Electronics日期:8月17日,亚博官网2018年许可证:此代码是公共领域,但如果您使用此代码,我们有一天会遇到您,请向我购买啤酒(Beerware许可证)。不要对这个代码期望太高:它只是向串行终端打印一条好消息…但是,它演示了从超显示库派生的类的实例化。一旦你实现了这些功能:getoffsetcolor(color\u t base,uint32像素);-硬件像素(uint16_t x0,UIT1616T Y0,彩色数据,uint16_t颜色周期长度,uint16_t startcoloroffset);然后,您将能够使用所有这些标准化功能(在不久的将来还会有更多功能!)-x line-y line-rectangle-fillfromarray-fillwindow-line-polygon-circle*/include“bareenecessary.h”//单击此处获取库:http://librarymanager/sparkfun_hyperdisplay define num_pix 64 define num_pix_y 64//注意:这不会使任何显示工作,因为功能未实现,亚博官网然而,它表明,这个实现是即时的、无人机的、最小的显示(num_pix_x,num_pix_y);void setup()//将设置代码放在此处,运行一次:serial.begin(9600);serial.println(“示例1:简单的裸露必需品”);serial.println(“嗯,这是一个很好的启动点,以防您想在超显示库下创建自己的显示类。玩得高兴!:d);void loop()//将主代码放在此处,重复运行:

资源和进一步发展

有关本教程的信息:

想改进超显示吗?

我们渴望分享和改进超显示。如果你对某个功能有想法,错误修复,或者其他评论,请随意写一篇问题,或者更好的做法是拉动请求加上你的东西!

对抽象感兴趣?

Hyperdisplay从用于显示它的设备中提取二维图形。你有没有考虑过抽象出现的其他地方?

  • HD中的窗口功能类似于坐标抽象
  • Arduino IDE是对微控制器(串行,SPII2C,GPIO模拟等)。亚博国际官网

你可以学习用你想亚博在线娱乐官网要的任何语言编写可扩展代码,那就去试试吧!

需要灵感吗?看看下面的教程!

图形LCD连接指南

如何使用84x48单色图形LCD向您的项目添加一些华而不实的图形。亚博官网

Microview连接指南

一个快速教程,让您启动和运行与您的MicroView开发板。
新!

透明图形OLED分接连接指南

未来就在这里!我们的Qwiic透明图形OLED分接允许您使用I2c或SPI连接在透明屏幕上显示自定义图像。

QWIIC微型OLED连接指南

开始用Qwiic微型OLED显示内容。

亚博在线娱乐官网学习.spa亚博官网rkfun.comγCC BSA SA 3| 亚博官网Sparkfun电子公司科罗拉多州

AST-CAN485 WiFi屏蔽连接指南 巨人亚历克斯 网址:https://w亚博官网ww.sparkfun.com/users/9212 urn:uuid:b3a1746-95da-84cc-6961-34f84ac2e830 2019年2月14日00:00:00-07:00

AST-CAN485 WiFi屏蔽连接指南亚博在线娱乐官网learn.亚博官网sparkfun.com教程

可在线访问:http://sfe.io/t828

介绍

什么能使AST-CAN485更好呢?WiFi!为了进一步提高CAN485的通信能力,我们提出AST-CAN485 WiFi屏蔽.该屏蔽基于Sparkfun ESP8266,允许CAN亚博官网485模块通过WiFi进行通信。

亚博官网Sparkfun AST-CAN485 WiFi屏蔽

亚博官网Sparkfun AST-CAN485 WiFi屏蔽

WRL 14597
16.95美元

所需材料

要遵循本教程,你需要以下材料。但你可能并不需要一切,这取决于你拥有什么。把它加入你的购物车,通读指南,并根据需要调整推车。

工具

根据您的设置,你需要一个烙铁,焊料,和一般焊接附件将针脚焊接到AST-CAN485上。您还需要一个平头和剥线钳将电线连接到螺钉端子。

烙铁-60W(可调温度)

烙铁-60W(可调温度)

TL-14566
12.95美元
袖珍螺丝刀组套

袖珍螺丝刀组套

TL—12891
3.95美元
无铅焊锡-15克管

无铅焊锡-15克管

TL—09163
3.50美元
剥线钳-20-30AWG

剥线钳-20-30AWG

TL-14763
14.95美元

建议阅读

我们建议查看AST-CAN485连接指南以开始使用电路板。根据您的设置,您可能需要安装自定义库和板附加组件。

AST-CAN485连接指南

3月1日,二千零一十八

ASTCAN485是普罗米尼紧凑外形的微型阿杜诺。除了所有常见的功能外,它还具有板载CAN和RS485端口,能够快速方便地与多种工业设备连接。

如果您不熟悉以下概念,我们还建议在继续之前先查看这些教程。

使用电线

如何剥离,卷曲,和电线一起工作。

ESP8266事物发展委员会连接指南

Sparkfun的ESP826亚博官网6物联网开发板概述。

关于使用U.FL的三个快速提示

关于如何连接的快速提示,保护,并断开U.FL连接器。

硬件概述

输入功率

AST-CAN485 WiFi屏蔽为您的电源提供螺旋式终端,RS-485信号,以及CAN总线信号,预先折叠到板上以实现快速和安全的连接。

螺钉终端突出显示

输入电压范围为7- 24VDC.输入电压被调节到5V为CAN485板供电,以及3.3V为ESP8266供电。

综合动力亮点

ESP8266

基于亚博官网Sparkfun ESP8266东西,您可以使用PCB跟踪天线,或U.FL连接器(如果安装在金属外壳中)。

ESP8266亮点

编程开关

因为UART连接在CAN485板和ESP8266上,开关用于分离Rx和Tx信号。编程ESP8266或CAN485板时,将开关移到PROG位置,上传完成后,将开关切换到运行位置。

切换突出显示

说到编程,ESP8266从3.3V逻辑,所以要编程ESP8266,一3.3V使用USB到UART网桥。

FTDI编程头高灯

AST-CAN485串行端口

一个报头断开CAN485使用的软件串行端口。这可以用作调试串行端口或连接其他设备。

软件序列突出显示

插销

WiFi屏蔽的引出线如下所示:

列表插销

图片由AST提供

示意图

下图显示了插入的CAN485模块和集成ESP模块之间的互连布局。

插入的CAN485模块与集成ESP模块之间的连接示意图

图片由AST提供

CAN485和ESP8266之间的主要接口是一个串行端口。它在CAN485的硬件串行端口0上工作,而不是传统的软件串行端口。这是因为它可以在两个设备之间实现更高速的通信。此功能的权衡是使用主串行端口,它还用于对CAN485进行编程,并在其FTDI头上断开。这意味着为了对CAN485模块进行编程,插入时,必须断开串行端口。因此,增加了模式选择开关,允许Rx和Tx线路断开。以类似的方式,相同的串行端口用于对ESP8266进行编程并与CAN485通信。模式选择开关还可以通过断开与CAN485的连接对ESP进行编程。

硬件连接

AST-CAN485 WiFi屏蔽带有预先焊接到板上的头。如图所示插入CAN485,使CAN485的FTDI头靠近ESP8266。

插入CAN485的WiFi屏蔽

为董事会供电

屏蔽可以通过螺钉端子供电。而电源输入拟与24V,输入电压为7- 24V可以使用。

集成电源调节24V输入功率下降至5V用于为插入的CAN485板供电。这是进一步规定下来的3.3V为ESP模块供电。

也可以使用CAN485模块的原始输入引脚为电路板供电。然而,建议使用外部24伏电源,这是预期的使用情况。

向董事会供电

图片由AST提供

软件设置和编程

注:此示例假定您正在桌面上使用最新版本的Arduino IDE。如果这是你第一次使用Arduino,请回顾我们的教程 安装Arduino IDE。如果您以前没有安装Arduino库或板附加组件,请查看我们的 库安装指南和安装说明 AST-CAN485板附加文件.

编程模式选择开关

ESP和CAN485模块使用硬件串行端口连接。同一个端口用于对任一设备进行编程。因此,有必要断开串行端口,以便对任一设备进行编程。为了实现这一点,提供了一个选择开关。

如果选择开关设置为运行,ESP和CAN485通过串行端口连接。如果开关设置为PROG,串行端口断开,设备可以编程。

编程选择器端口

为ESP编程设置Arduino

对基于ESP8266的设备进行编程有许多选择。本指南建议的方法是利用ESP社区开发的ESP8266 Arduino插件。加载项可以通过Github存储库或者单击下面的按钮。

此实现基于ESP8266,可以使用相同的设置说明。更多信息,参考ESP8266事物连接指南.

如果您以前没有安装过Arduino库,请查看我们的安装指南。

安装Arduino库

1月11日,二千零一十三

如何安装自定义Arduino库?这很容易!本教程将介绍如何使用Arduino库管理器安装Arduino库。对于未与Arduino IDE链接的库,我们还将继续手动安装Arduino库。

编程ESP

按照以下过程对ESP模块进行编程:

  • 将模式选择开关切换到程序。
  • 插入一个3.3VFTDI进入FTDI头段。
  • 按住ESP编程按钮并上传草图。
  • 返回模式选择开关以运行以重新连接设备。

对ESP模块进行编程

对ESP模块进行编程

图片由AST提供

对CAN485进行编程

按照以下过程对CAN485模块进行编程:

  • 将模式选择开关切换到程序。
  • 连接一个5VFTDI连接到CAN485模块上的FTDI头段。
  • 上传素描
  • 返回模式选择开关以运行以重新连接设备。

对插入的CAN485模块进行编程

编程插入CAN485模块

图片由AST提供

实例

这个WiFi屏蔽Github存储库包括几个例子来演示板的使用。下载存储库后,在Arduino IDE中打开一个示例。选择CAN85作为董事会,它枚举的COM端口,点击上传测试。

基本串行示例

这个例子演示了和插入的CAN485和板载ESP8266之间的串行通信。每个设备都有一个内置LED,由另一个设备通过串行端口控制。操作如下:

  • CAN485每100毫秒向ESP发送一个命令。
  • 电子稳定程序根据指令将其发光二极管设置为打开或关闭。
  • ESP将相同的命令发送回CAN485。
  • CAN485根据ESP接收到的命令设置其LED。

除了WiFi Shield Github存储库中的示例外,在esp arduino库中有许多使用esp8266的示例。这些可以在Arduino IDE中访问文件>实例.示例也可在ESP Github社区论坛.

资源和进一步发展

更多信息,查看以下资源:

AST-CAN485 WiFi屏蔽

AST-CAN485 DEV板

下一个项目需要一些灵感吗?亚博官网查看以下一些相关教程:

OBD II UART连接指南

如何开始使用OBD-II UART板。

CAN总线屏蔽连接指南

使用CAN总线屏蔽的基本介绍。

OBD-II入门

在汽车和工业应用中用于通信的OBD-II协议的一般指南。

或者根据Pete进一步了解有关RS485的更多信息。


亚博在线娱乐官网学习.spa亚博官网rkfun.comγCC BSA SA 3| 亚博官网Sparkfun电子公司科罗拉多州