您现在的位置是:网站首页> 硬件
实用代码下载
- 硬件
- 2022-04-08
- 841人已阅读
实用代码下载
基于Arduino的3D图像显示装置
基于Arduino的3D图像显示装置,是利用开源硬件Arduino配合点阵显
示器显示图像,并利用旋转的方式解决显示介质问题,用视觉暂留的原理,实现
三维显示,以实现显示粗糙的三维图形.配上制图软件,用于简单的教学,装饰,
展示等.操作方便快捷
市场上有许多三维的旋转显示器,
可仔细观察后发现,市场上所谓的“裸眼3D”,只不过是在一个面上的画面成像,
做不到从不同的角度观察,看到不同的画面。于是, 本着创客精神,我决定利用
开源硬件Arduino自己做一个图像显像更逼真、操作更简便的3D图像显示装置
1查询类似作品研究现状
目前的3D显示风扇多为平面显示,不能达到多角度观察的目的
2制定计划与结构
以同样的旋转的结构来显示,但是把线条灯改为点阵灯.
3显示系统的搭建与代码编写
4对运行进行调整和配重
5进行电脑程序的代码编写
设计思路:
1 Arduino简述:
Arduino是一款便捷灵活、方便上手的开源电子原型平台,具有使用类似Java、
C语言的Processing/Wiring开发环境.
主要包含两个主要的部分:硬件部分是可以用来做电路连接的Arduino电路板;另
外一个则是Arduino IDE,计算机中的程序开发环境。Arduino能通过各种各样
的传感器来感知环境,通过控制灯光、马达和其他的装置来反馈、响应环境。板
子上的微控制器可以通过Arduino的编程语言来编写程序,编译成二进制文件,
烧录进微控制器。
Arduino是目前全球最流行的开源硬件,本作品就是用到了C++编译完成。
2 结构概括:
本作品分为三个部分分别是显示系统(主要部分),旋转台(使显示系统旋转),制
图软件(可以用于编辑并生成图像).
处理器分为两块单片机(Arduino Nano)
左边的单片机用来读卡,显示画面,测速;
右边的单片机用来处理实时数据,如遥控信息等(未来可增加传感器)
注:显示系统和旋转台固定为一体,使用时不可拆卸.如下图
显示系统组成:
如下图
硬件 单元器件清单列表 器件功能
1 单片机1#(Arduino Nano) 用来读卡,显示画面,测速;
2 单片机2#(Arduino Nano) 用来处理实时数据,如遥控信息等(未来可增加传感器)
3 16*16LED点阵发光板 接收单片机1#指令显示红、绿光
3 红外遥控避障传感器 测试转速,并回馈给单片机1#
4 红外遥控接收头 接收遥控器指令
6 150mAH锂电池软包 提供显示系统供电
7 锂电池充放电控制器 控制锂电芯充电安全
8 存储卡接头 提供外插卡读取
9 马达3V 提供转台动力
10 连接导线、焊笔、胶枪 辅助完成 芯针连接
软件 软件清单 功能
1 Arduino IDE(C++语言编写) 显示系统( 单片机控制显示程序)
2 flash CS6(AS3.0语言编写) 制图软件(可以用于编辑并生成图像).
显示系统运行过程:
1. 旋转台开始旋转,显示系统利用红外传感器获取当前转速
2. 当装速测量后 通过程序计算后进行每个面的显示,将360度的一圈分为8个
画面
程序运行过程总结如下:
使用的操作过程:
1使系统成像:
->打开显示系统开关
->给旋转台电池盒装入两节5号电池,打开电池盒开关
->在等待8秒 左右后系统正常成像
->显示过程中,可以使用遥控器上的数字按钮切换图像
->也可以使用遥控器上的绿色按钮控制图像旋转(通过装速差异实现)
->以下两图为大致的显示效果(立方体和立体2次函数)
2修改储存卡图像
->按下读卡器,储存卡弹出
->将储存卡插入U盘读卡器,连接电脑
->打开U盘根目录下的dbox.exe 即可进行图像编辑
->编辑图像后点击左侧的按钮将图像文件保存至U盘根目录即可
->拔出U盘读卡器 将储存卡插回显示系统的读卡器即可正常运行
3充电
->旋转台的电源使用时间约为10分钟 需及时更换电池
->显示系统电源使用时间约为30分钟 开机时,当单片机指示灯快闪,或使用时
4遥控
->遥控按按钮短按即可 否则可能无效
左边为按钮功能介绍
关于核心开源代码:
开机自动测量电压的函数
[
long readVcc() {
long result;
ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
delay(2);
ADCSRA |= _BV(ADSC);
while (bit_is_set(ADCSRA,ADSC));
result = ADCL;
result |= ADCH<<8;
result = 1125300L / result;
return result;
}
if(long readVcc()+1.1<3){
while(1){
}
}
//开机时测量显示系统供电电压,如果电压小于3V,则开机无法使用,提醒充电
]
读取储存卡16进制值
[
#include <SPI.h>//库索引
#include <SD.h>
File myFile;
String fien = "dm0.3dm";
char buf[8];
uint16_t tmp;
myFile = SD.open(fien);//打开文件
while(myFile.available()) {//一旦有内容,则读取内容
char inCharm = (char)myFile.read();
if(inCharm!=','){
if (inCharm != '\n') {
if (inCharm != '\r') {
inputString+=(char)inCharm;//读取一个字节
}
}
}else{
inputString.toCharArray(buf,sizeof(buf));
sscanf(buf,"%x",&tmp);//字符串转16进制
mais[xc][row]=tmp;//总数组赋值
inputString="";//清空字符串,接收下一组数据
row++;//排变量加1
if(row>23){//排变量满值后,行变量进位
xc++;
row=0;
}
}
}
]
单片机控制LED16*16代码
[
for(xc=0;xc<8;xc++){//面循环
for(row=0;row<12;row++){//列循环
if(mais[xc*2][row*2]!=0x00 || mais[xc*2][row*2+1]!=0x00){
//检测显示数组的的数据是否不为空,如果为空,则跳过显示,减少计算量
co=rr;//颜色设置为红色(7,8引脚的切换)
digitalWrite(gg,1);
shiftOut(co,CLK,MSBFIRST,~mais[xc*2][row*2]);//输出列数据前8
shiftOut(co,CLK,MSBFIRST,~mais[xc*2][row*2+1]); //输出列数据后8
digitalWrite(OE, 1); //关闭显示
hc138sacn(row+2); //换行,为下一行显示做准备
digitalWrite(LATCH, 0); //595刷新
digitalWrite(LATCH, 1);
digitalWrite(OE,0); //开启显示
delayMicroseconds(30); //延迟30微秒,增加视觉暂留效果
ycc++;//延迟变量加一
}
}
digitalWrite(OE, 1); //关闭显示
delayMicroseconds((vt/16-ycc*0.2407-0.03)*1000);
//延迟(当前速度/16个面-显示过的面*计算时间-总计算时间)
ycc=0;
}
]
制作时遇到的主要困难:
1电线的焊接,旋转的配重等手工方面问题为主要困难
2程序的编写等问题参考了CSDN,Arduino中文站等网络文献
当前的不足:
1因为单片机的计算速度有限,在高速状态下显示的图像出现轻微变形 有待改
善。
2旋转台与显示系统连接处固定不佳,旋转时产生的离心力,导致图像不重合。
创新部分:
1经济实惠:用到一些简单的电子元器件与手工制作而成,成本仅在100元左右。
2便携方便:占用体积较小,可以在多处展示.修改模型快捷,只需将读卡器插入
电脑简单修改后插回即可使用。
3用处多样:可用于多种场合,如用于教学中显示数学的几何与函数图形,用于会
议上显示立体统计图。
结语:
此装置利用Arduino控制显示图像,实现三维立体显示的创新.利用这个装
置,人们可以从多个角度观察到三维图像, 具有很大的应用价值。