电路仿真——零投入玩转Arduino开源硬件系列之一
"大众创新 万众创业",学校对于创客教育日渐重视,热情高涨,纷纷开始创客教育课程,有条件的打造学校创客实验室,不吝斥资;但是也有很多学校囊中羞涩,巧妇难为无米之炊,不知何处下手.
诚然很多朋友说,现在硬件便宜了,买个山寨的不到20,自己diy10元,但是实际情况是硬件的申请是要报计划的,流程冗长繁复,短则几月,长则经年,等到设备下来,黄花菜都凉了,老师们并非没有热情自购,但是终究不是长久之计,实际上像淄博于方军老师最开始就是自购硬件自己玩儿,带几个学生玩儿,然后从兴趣小组发展到社团,从社团发展到兴趣班到班级授课.突然想起还请支教的那几个小朋友了,安装软件棒棒哒.
就我2012以及2013年在青岛市黄岛区海青镇和菏泽曹县支教的经历以及不时回老家访谈的情况而言,当前很多学校办公经费短缺,用于创客教育的资金甚少,难以开展活动.后来遇到了随身科技的杨峰,我们两个非常投缘,探讨设计硬件开发课程,后来我选择了一些一线教学中常用的硬件模块并从淘宝购买了散件,自己配了大概30套Scratch随身实验包,Arduino芯片用的是国内的版本,中贝斯特,Arduino Uno兼容版价格是24元,Arduino Nano小板子的价格是19元,大大降低了成本.我当时只加入了红绿蓝各色LED灯,RGB全彩灯,蜂鸣器,光敏电阻以及杜邦线,连面包板都是用的4块钱一个的小板子.但是配套课程迟迟未出,也是醉了,但是各学校可以采用这样的思路开展自己教学.
当然如果DIY的话,一个Arduino的成本在10元左右
可是有些学校资金实在是极度短缺,怎么办呢?突然记起2010年大四上学期我在东师的时候,学校聘请我们系的师兄师大附中的尚航师兄给我们讲解机器人,当时用过VJC的机器人仿真环境,豁然开朗,现在用VMware,VirtualBox以及Qemu等模拟操作系统,用VJC模拟机器人,模拟Arduino电路板自然不在话下.于是开始留意电路仿真软件.
之前也有接触过机器人仿真软件Microsoft Robotics Studio,大概尝试了下,是一款相当棒的软件,在资金不足的情况下,可以让学生通过这个软件了解机器人,进行一些编程活动.
Microsoft Robotics Studio是为科研工作者、机器人业余爱好者和商业开发者提供的一个基于Windows平台的环境,它可以与诸多各类的硬件一起简单的实现机器人应用。 Microsoft Robotics Studio开发环境的特点和益处包括:结合紧密的机器人开发平台, 轻量级实时定向服务, 可扩展性的平台。
来源:Microsoft Robotics Studio入门系列
Microsoft Robotics Studio面向广泛的人群,加速机器人的开发与普及。实时仿真器是提出的一个重要的部分。它是可以立即从电脑和游戏控制台显现,??,当它可以支付得 起、广泛的应用、机器人仿真技术。游戏依赖于使用带有实时系统规定参数的物理仿真器所制做出的照片级真实渲染效果。这对我们的努力是一个极好的起点。
软件界面 Microsoft Robotics Studio昨日在图书馆无事乱翻书,看到一本书<Arduino软硬件协同设计实战指南>,里面介绍了
电子设计自动EDA(electronic design automation),从计算机辅助设计CAD,计算机辅助制造CAM,计算机辅助测试CAT和计算机辅助工程CAE的基础上发展来的.
Arduino软硬件协同设计实战指南
介绍了Fritzing, Virtual BreadBoard, Proteus, EAGLE四款软件.豁然开朗
本来打算到京东购买此书,价格是50.2,发现京东阅读APP上也有此书,然后发现京东畅读一年的价格是98,遂购买京东畅读,免费阅读此书.
通过利用上述四款软件,可以对电路进行模仿,从而实现不投入资金的情况下学习Arduino硬件编程.
软件介绍
Fritzing
FritzingFritzing是个电子设计自动化软件。它支持设计师,艺术家,研究人员和爱好者参加从物理原型到进一步实际的产品。还支持用户记录其Arduino和其他电子为基础的原型,与他人分享,在教室里教电子,并建立一家生产印刷电路板的布局。
Fritzing是一款支持多国语言的电路设计软件,可以同时提供面包板/原理图/PCB图三种视图设计,不管设计者在三种视图中的任意一种进行电路设计,软件都会自动化同步其他两种试图.还可以生成制版厂生产所需要的greber文件,PDF图片和CAD格式文件,极大的推广和普及了Fritzing的使用.
——引自:《Arduino软硬件协同设计实战指南》
个人觉得使用Fritzing的好处之一是,学生在实际动手设计电路的时候先用软件模拟,谋定后动,避免烧坏电子元器件或者无谓摸索浪费时间.
Arduino样例支持与编程
Fritzing中有所有的Arduino自带实例的电路图,便于学习,在实际教学中
Virtual BreadBoard(简称VBB)
Arduino仿真利器Virtual BreadBoard
这个软件目前收费,但是大家肯定有不花钱的办法对吧.
Proteus电路仿真软件
选中视图 模拟仿真交流电源和灯泡,随着交流电压大小的变化,灯泡的亮度也变化解决方案
在《Arduino软硬件协同设计实战》(这本书应该给我广告费)里给出了详细的通过电路仿真软件模拟仿真Arduino硬件及各种硬件并且写入程序的方法,大家可以参阅.(好吧我承认我懒啊,懒得写辣么多)
以上仿真软件可以跟Arduino软件协同使用,仿真软件会自动加载Arduino软件生成的hex文件,执行程序并仿真.
教师可以在机房配置好环境,通过网络同传给学生机,这样学生机就可以在电脑上进行模拟仿真了,同时最好教师自己有一套实际的硬件,毕竟模拟的不如实际的硬件动手来的直观.
再有就是突然想到类似于3dmax等三维建模软件不知道是否有类似于电路仿真的插件,如果有的话直接就可以把模型设计和电路设计结合在一起了.当然工业街应该有这样的软件,可惜没有简单易用的
仿真不是目的,只是手段,教学生自己动手软硬结合比啥都重要有意义有兴趣.只是在资金不足的时候,让所有学生有接触软硬件的机会.
——南京药科大学周玉林
突然有个疑问,现在提到开源硬件,必然是Arduino,Arduino当然简单易学,资料众多,便于推广,但是stc等也不错啊,只是未必软适合义务教育阶段学校罢了,不够高中阶段学习是没有问题的,早在2013年的时候师大附中的金书辉老师就带领学生玩儿单片机了,所以你看关键还是要有合适的引导,采用适合学生的方式来传授知识.
又飘雪大神指点搜proteus和Arduino就能找到相关内容,感兴趣的可以找一下.
Arduino驱动LED灯整体来说,Proteus的Arduino仿真硬件部分是基于Proteus的原理图,而程序驱动部分则是依赖于Arduino程序在Arduino IDE中编译生成的Hex文件
Atmega328P就是Arduino UNO的芯片在这用来代替Arduino Uno
19号实际上就是Arduino13引脚,通过10k的电阻接地.
仿真结果
具体教程放两篇文章:
基于Protues的Arduino学习笔记01-Arduino UNO实验板设计
一下内容转载自EEboard爱板网:http://www.eeboard.com/bbs/forum.php?mod=viewthread&tid=3429
图4 Arduino程序的编译
二、Arduino单片机的Proteus仿真方法
Arduino单片机的Proteus仿真基本过程是:软件在Arduino IDE编程软件里编写,硬件在Proteus ISIS软件模块里通过绘制电气原理图建立。程序编写完后,选择Arduino IDE编程界面菜单栏的Tools菜单项,再选择Board→Arduino Duemilanove w/ATmega328,也可以选择Board→Arduino Uno,然后点击编译按钮,生成Hex文件(二进制机器码文件)。有了Hex文件,接着转到Proteus电气原理图,双击原理图中的型号为ATMEGA328P 单片机芯片,出现对话框,通过文件目录浏览的方法确定Hex文件存储位置,并进行一些单片机芯片工作状态参数的设置,最后点击Proteus ISIS软件界面左下方的播放按钮,就可以看到Arduino单片机在Proteus仿真环境中的运行效果了。
图4中显示的程序是一个最简单的Arduino单片机项目实例,任务是:连在Arduino单片机数字端口13上的LED发光二级管,让它不断闪烁。要想成功仿真这个项目,有两点要特别注意,一是Arduino程序的Hex文件生成和位置确定,二是Proteus原理图中的Atmel328P芯片中Hex文件加载和工作参数设置。
图5 Arduino项目实例LED闪烁的硬件原理图
Arduino编译之后,Hex文件会自动删除,而在Proteus仿真的Arduino单片机中,需要使用Arduino软件产生的Hex文件,可是,Arduino 1.0默认使用完Hex文件会自动删除的,所以取不到hex文件,为了取出hex文件,加载到Porteus中的单片机ATMEGA328P,需要修改如下:
首先要在D盘建立一个文件夹,用来专门放置Hex文件,文件名可以随便取名,我命名为Arduino_Hex,然后点击Arduino软件界面菜单栏的File->preferences,打开对话框,如图6,把Show verbose output during的两个参数项打勾,双击preferences.txt文件,找到文件所在位置,再双击,用记事本打开文件。这时要点击Arduino界面preferences对话框下方的OK按钮,接着关掉Arduino IDE编程界面。最后,在刚才打开的preferences文档的最后一行编辑加入build.path=d:\Arduino_Hex,保存文档。这样以后您再编译Arduino程序,就可以在d:\Arduino_Hex中,看到编译的Hex目标文件了。(所有图片双击,都可以放大!)
图6 Arduino的Preference参数设置
谈完了Arduino程序的Hex文件生成和位置确定,再谈谈另一个值得注意的问题,Proteus原理图中Atmel328P芯片的Hex文件加载和工作参数设置。
双击图5中的Proteus ISIS电气原理图中ATMEGA328P单片机,出现编辑对话框,点击“Program File”参数项的“文件夹”按钮,来确定Hex文件的位置,到d:\Arduino_Hex文件夹中可以找到当前程序的Hex文件。上个程序的Hex文件会被新编译的Hex文件“冲掉”,所以您每次仿真项目时,都要编译一次Arduino程序。
图7 Proteus中的ATMEGA328P单片机的Hex文件加载和参数设置
确定了Hex文件,还有三个参数项要修订,一是“CLKDIV8(Divide clock by 8)”参数项修改为“Unprogrammed”;二是“CKSEL Fuses”参数项修改为“(1111)Ext. Crystal 8.0-MHz”;三是Advanced Properties的Clock Frequency参数项设为16Mhz。最后点击编辑对话框的“确定”按钮,然后就可以仿真了。
网络上有一个Arduino单片机的Proteus仿真视频,讲解的就是图5所示LED灯闪烁的项目,可以看看Proteus电气原理图是如何建立,Arduino程序是如何编写,以及程序编译后是如何仿真的过程。只不过这个视频中,Arduino程序编译后的Hex文件,并没有在自己指定的文件目录里找到,而是还是用老办法在默认目录里找到。
三、Arduino单片机的Proteus仿真项目实例
这个仿真项目实例的任务是:分别按下K1(正转)按钮、K2(反转)按钮和K3(停止)按钮,直流电机会分别产生相应的动作,而且当调节电位计时,电机的转速也随之发生变化。(所有图片双击,都可以放大!)
图8 直流电机正反转、启停和调速仿真图
图8中的电气符号用到了芯片元件、电源终端、虚拟仪器和连线标号,它们分别从各自的模式库中提取出来。
图9 仿真图中的电气符号的提取
仿真图中,电源终端用到了VCC电源与接地符号,虚拟仪器用到了四通道示波器和直流电压表,连线标号的作用是相同连线标号的两根线在电气意义上是相连的,如图8中的标号A、B和PWM。至于芯片元件,仿真图里用到了电阻、电容、CPU、晶振、直流电机、稳压管、L298N驱动等等,芯片元件的提取通常有两种方法,父、子类别检索方法和关键字查询法。
父、子类别检索方法是:先选择元件模式库,再点击“P”按钮,打开元件查询提取对话框,如图10所示,例如提取的元件是单片机芯片ATMEGA328P,先在类别里找到Microprocessor ICs,在子类别里找到AVR Family,再在制造商里找到Atmel,然后在缩小了寻找范围的结果中找到这个单片机芯片ATMEGA328P,找到后双击芯片,就可以把芯片提取到ISIS界面左侧的DEVICES栏中,供原理图绘制时随时选用,如图11所示。
图10 芯片元件的父、子类别检索法
关键字查询法是:如果事先知道要提取的元件名称,可以在元件查询提取对话框左上方的关键字输入栏里输入元件名称,如搜寻motor元件,直接输入motor,回车后,在结果中可以很容易地找到所需元件。
图11 芯片元件的关键字查询法
按照图8所示的直流电机控制电气原理图,把硬件线路绘制完成,剩下的事就是编写程序,编译仿真了,我设计的这个仿真项目正好把数字量和模拟量输入输出都涉及到了,按钮输入和驱动芯片L298N的电机转向控制端A、B是数字量输入输出,电位计输入和L298N的转速调节控制端PWM是模拟量输入输出。
数字量输入输出的Arduino命令分别是digitalRead(数字端口号)和digitalWrite(数字端口号,LOW或HIGH);模拟量输入输出的Arduino命令是analogRead(模拟端口号)和analogWrite(数字端口号, 0~255)。模拟端口只有输入模式,没有输出模式,Arduino模拟量输出是以PWM信号形式从具有PWM输出功能的数字端口输出的。Arduino微控制器的数字端口和模拟端口与ATMEGA 328芯片引脚的对应关系图如下。标有013标号的引脚对应的是数字端口,在013前面有符号“”的引脚对应的端口具有PWM输出功能。标有A0A5标号的是模拟端口。
图12 Arduino UNO端口与Atmega328P引脚对应图
有了Arduino UNO端口与Atmega328P引脚对应图,就可以方便地利用Proteus硬件仿真图,有针对性地编写Arduino程序了。由于以下程序中有详细的注释,所以对每行Arduino程序的作用就不再累述了。
Arduino程序:
//任务:通过按钮控制电机启停和正反转,通过电位计调节电机转速。
int K1=5; //把K1(正转)按钮连在数字端口5
int K2=6; //把K2(反转)按钮连在数字端口6
int K3=7; //把K3(停止)按钮连在数字端口7
int potpin = 3; // 把电位计连在模拟端口3
int A=2; //数字端口2、3控制电机启停和转向
int B=3;
int PWMpin = 9; // 数字端口9输出PWM信号,控制电机转速
//初始化
void setup()
{
pinMode(K1,INPUT);//把数字端口5、6、7设置输入模式
pinMode(K2,INPUT);
pinMode(K2,INPUT);
pinMode(A,OUTPUT);//把数字端口2、3设置输入模式
pinMode(B,OUTPUT);
}
//主程序
void loop()
{
//如果按下K1(正转)按钮
if(digitalRead(K1)==LOW)
{
//电机正转
digitalWrite(A,HIGH);
digitalWrite(B,LOW);
}
//如果按下K2(反转)按钮
if(digitalRead(K2)==LOW)
{
//电机反转
digitalWrite(A,LOW);
digitalWrite(B,HIGH);
}
//如果按下K3(停止)按钮
if(digitalRead(K3)==LOW)
{
//电机停止
digitalWrite(A,LOW);
digitalWrite(B,LOW);
}
int sensorValue = analogRead(potpin); //读取电位计采样值
sensorValue = sensorValue/4; // 采样值 0-1024 转换为 0-255
analogWrite(PWMpin, sensorValue);//把处理后的转换值以PWM信号形式输出
delay(20);//延时
}
把程序编写完,编译Hex文件,再把Hex文件加载到Proteus仿真图中Arduino单片机芯片中,最后点击仿真图左下方的播放按钮,就可以看到基于Arduino直流电机控制项目的运行效果了。
四、结束语
经常有对创客文化感兴趣的网友,询问这样的问题,是否可以少投入些硬件成本,而又能用Arduino单片机多多做些趣味电子项目。所以这篇文章就是谈在资金不足的情况下,如何通过仿真的方法来实现我们创意实践。
为啥有必要学习Arduino呢?其实许多学习者曾经为了追赶电子科技的进步,也花了大量的精力去一个个地学习那些微控制器和智能逻辑部件,如51、ARM,DSP和FPGA,当初仅仅是为做一些应用,没想会消耗那么多的时间和金钱,“陷在”了冷酷的程序和无止尽的硬件原理中,最后也只是做了些走马灯和数码管秒表实验,就草草结束,而又去追新了。这样追逐哪有什么利用微控制器做应用的乐趣可谈。好在目前秉承开放式学习架构的Arduino系统越来越流行,它可以让所有乐于创作的人在短时间之内就可以完成一个作品,并且可以透过网络,获得大量共享资讯的支援。您会发现,有了Arduino,微控制器的世界不再那么的陌生和令人敬畏,微控制器就是一个易用的工具,让我们能够腾出精力全力投向作品中最能体现个人创新精神的部分。