这是一个七段时钟,其中我们有在查看窗格的Z轴上移动的段而不是LED,这些段的深度差异将使观看者能够看到白色段上的白色时间。我们使用Arduino微控制器首先处理读取的当前时间,然后通过电机控制器相应地对齐段。这件作品是我以前用纸做的时钟的升级版,这次我购买了一台3D打印机来使这款时钟成为现实,因为这件作品的精度和机械特性需要坚固可靠的部件来打造干净的表面和机芯。这是一个七段时钟,我们让它在观景窗格的Z轴上移动,而不是LED,这些段的深度差异将允许查看器看到与白色段上的白色的时间。我们使用Arduino微控制器首先处理当前读取的时间,然后通过电机控制器相应地对齐段。这篇文章是我之前在纸上做过的工作的延续。我买了一台3D打印机,使这个时钟成为现实,因为这件作品的精度和机械性需要强大和可靠的部件,以创造一个干净的完成和运动。补给品Arduino-大脑Arduino巨型传感器盾-I/ODS3231或RTC时钟突破-跟踪时间30伺服-移动每个段3D打印机+灯丝第1步:打印零件我做了这个设计与滑动和捕捉适合部分。由于这是一个大的机械件,设计较小的零件,使我可以快速重复对个别组件。每个数字由插入面板的7个段组成。时钟的主体容纳了其中4个数字面板。后面板滑入面板,其中段沿齿轮移动以创建线性运动。STL为您提供了选择的打印机切片和打印。每件作品的打印方向对这个项目至关重要。这是因为,如果图层的方向相互摩擦,段实际上会产生太多的摩擦。我们还小心翼翼地确保时钟的正面是直接印在钢板上的碎片,因为这将在普鲁萨上创建清洁的表面。完成对这件作品的美学很重要。返回。脸-1.stl脸-2.stl齿轮.stl段-1.stl段-2.stl段-3.stl伺服第2步:将伺服连接到支架、拿一把螺丝刀,将伺服连接到支架上。螺丝应该与你的伺服器捆绑。伺服的位置是从安装的底部如图所示。对于所有30个伺服人员,您将需要重复此步骤。完成将其连接到支架后,剪断伺服头,并将其连接到齿轮上。您可以选择性地将此粘合在一起,以保持原位。第3步:将伺服支架连接到后面板每个面板是一个七段显示器,每个面板上附加7个伺服和支架。它们配有快速适合括号。如果您正在进行一些调试,并且需要拆下支架,请取一对钳子夹紧捕捉拟合机制以释放支架。第4步:将面板添加到主体将段面板滑入时钟的背面。结肠有四个数字面板和一个面板。主体包括对齐标志,将保持碎片对齐,便于组装。、第5步:将伺服器连接到微控制器将伺服器连接到微控制器。数字的每个部分从A到G都被订购。我们将将这些映射为1到7,以便连接到我们的微控制器。只需按顺序附加伺服,从以下引脚开始。第一个数字将在引脚2。第二位数字从引脚9开始。第三位数字从引脚22开始。第四位数字从引脚29开始。您可以参考源代码部分进行最终的引脚。第6步:将段插入显示屏这些业余舵机实际上只有180度的运动。为了校准和对齐机构,通过将所有伺服系统移动到其运动的末端(180度)来准备好所有的伺服系统。将段从显示器前部滑入每个单独的插座,您会感觉到伺服器接受了该段,插入时应该有一些轻微的阻力和部件的平滑驱动。第7步:编程我们的代码在循环中运行,它检查当前时间并将每个段的目的地移动到所需的位置。使用循环作为自动收报机,它会在伺服的角度上产生小增量,从而在段上创建平滑的推拉运动。由于本项目中使用的舵机很便宜而且不是最准确的,我们使用段间隔图来存储每个舵机的内部偏移。这就是我们如何确保当我们推动或拉动伺服系统时,它们都是对齐的。这对显示器的美感至关重要。字符串输入;#include#includeDS3231rtc(SDA,SCL);constintDIGIT_TO_SEGMENT_MAPPING[10][7]={{1,1,1,1,1,1,0},//0{0,1,1,0,0,0,0},//1{1,1,0,1,1,0,1},//2{1,1,1,1,0,0,1},//3{0,1,1,0,0,1,1},//4{1,0,1,1,0,1,1},//5{1,0,1,1,1,1,1},//6{1,1,1,0,0,0,0},//7{1,1,1,1,1,1,1},//8{1,1,1,1,0,1,1}//9};constintSEGMENT_INTERVALS[4][7][2]={{{141,54},{155,69},{150,73},{151,70},{159,75},{159,75},{125,40}},{{164,76},{155,76},{138,61},{180,87},{151,63},{145,57},{165,78}},{{157,73},{156,70},{165,85},{137,52},{133,50},{133,50},{168,73}},{{131,52},{147,61},{131,51},{158,69},{155,73},{116,28},{137,60}}};constintCOLON_INTERVAL[2][2]={{141,62},{137,30},};constintDIGIT_STARTING_SEGMENT_INDEX[4]={2,9,22,29};constintCOLON_STARTING_INDEX=16;constintSTART_POS=0;constint冒号=2;constintDIGITS=4;constintSEGMENTS_PER_DIGIT=7;constintSTEP_MS=20;constintCOUNT_MS=2000;constintNUM_SERVOS=DIGITS*SEGMENTS_PER_DIGIT;intservoTargetDestination[DIGITS][NUM_SERVOS];int伺服TargetDestinationColon[COLON];整数计数=1200;inttimeMS=0;伺服舵机[DIGITS][SEGMENTS_PER_DIGIT];伺服冒号Servos[COLON];无效设置(){rtc.begin();for(inti=0;ifor(intj=0;jintoffset=DIGIT_STARTING_SEGMENT_INDEX[i];伺服目标目的地[i][j]=SEGMENT_INTERVALS[i][j][START_POS];伺服[i][j].attach(j+offset);伺服[i][j].write(servoTargetDestination[i][j]);}}延迟(500);for(inti=0;ifor(intj=0;j伺服[i][j].detach();}}for(inti=0;iColonServos[i].attach(i+COLON_STARTING_INDEX);ColonServos[i].write(COLON_INTERVAL[i][START_POS]);}延迟(500);for(inti=0;iColonServos[i].detach();}for(inti=0;iColonServos[i].attach(i+COLON_STARTING_INDEX);ColonServos[i].write(COLON_INTERVAL[i][1]);}延迟(500);for(inti=0;iColonServos[i].detach();}}无效循环(){//检索并清理RTC字符串。“12:45”->“1245”StringtimeStr=rtc.getTimeStr();StringtimeString=timeStr.substring(0,2)+timeStr.substring(3,5);for(intactiveDigit=0;activeDigit//第一步:设置servoTargetDestinationStringstringCount=String(count);//交换到timeString以使用时钟。for(inti=0;i{intdisplayNumber=stringCount.charAt(timeString.length()-1-activeDigit)-'0';intplace=(activeDigit==3&&displayNumber==0)?0:DIGIT_TO_SEGMENT_MAPPING[displayNumber][i];伺服目标目的地[activeDigit][i]=SEGMENT_INTERVALS[activeDigit][i][placement];}//第2步:增加段for(inti=0;i{伺服舵机=舵机[activeDigit][i];intpos=servo.read();intdest=servoTargetDestination[activeDigit][i];如果(位置!=dest){如果(位置pos++;}别的{位置--;}如果(!servo.attached()){intoffset=DIGIT_STARTING_SEGMENT_INDEX[activeDigit];伺服.附加(我+偏移);}伺服。写(位置);}}}//第3步:等待延迟(STEP_MS);timeMS=timeMS+STEP_MS;//步骤4A:倒计时如果(时间MS>=COUNT_MS){时间MS=0;计数=计数+1;}//第5步:分离任何在其目的地的东西for(inti=0;ifor(intj=0;j伺服舵机=舵机[i][j];intpos=servo.read();int目的地=伺服目标目的地[i][j];if(pos==destination&&servo.attached()){伺服[i][j].detach();}}}}第8步:校准和设置上一步实际上需要额外的校准,因为我拥有的舵机与您的舵机参数完全不同。以下代码是我用来校准和查找每个伺服所需的间隔的代码/*使用电位计(可变电阻器)控制伺服位置作者:MichalRinott>2013年11月8日修改通过斯科特菲茨杰拉德http://www.arduino.cc/en/Tutorial/Knob*/#include伺服myservo;//创建伺服对象来控制伺服INT插针=0;//用于连接电位器的模拟引脚内部值;//从模拟引脚读取值的变量constintSEGMENT_INTERVALS[4][7][2]={{{146,57},{147,62},{138,51},{160,88},{135,64},{149,70},{139,58}},{{131,45},{150,53},{138,52},{146,61},{151,70},{140,57},{137,48}},{{157,73},{156,70},{135,50},{137,52},{133,50},{133,50},{168,73}},{{131,52},{147,61},{131,51},{128,43},{125,41},{104,24},{137,60}}};constintCOLON_INTERVAL[2][2]={{127,45},{156,81},};constintDIGIT_STARTING_SEGMENT_INDEX[4]={2,9,22,29};constintCOLON_STARTING_INDEX=16;constintSEGMENTS_PER_DIGIT=7;constintDIGITS=4;constintSTART_POS=1;constint冒号=2;整数段=12;无效设置(){伺服舵机[DIGITS][SEGMENTS_PER_DIGIT];伺服冒号Servos[COLON];for(inti=0;ifor(intj=0;jintoffset=DIGIT_STARTING_SEGMENT_INDEX[i];伺服[i][j].attach(j+offset);伺服[i][j].write(SEGMENT_INTERVALS[i][j][START_POS]);}延迟(1000);for(intj=0;j伺服[i][j].detach();}}for(inti=0;iColonServos[i].attach(i+COLON_STARTING_INDEX);ColonServos[i].write(COLON_INTERVAL[i][START_POS]);}延迟(1000);for(inti=0;iColonServos[i].detach();}myservo.attach(segment);//将引脚9上的伺服连接到伺服对象Serial.begin(9600);//以9600bps的速率打开串口:}intinputParse(字符串输入){//清号int角=input.toInt();如果(角度>180||角度角度=0;}回角;}无效循环(){如果(串行。可用()){段=inputParse(Serial.readString());Serial.print("附件:");Serial.println(segment);myservo.detach();myservo.attach(segment);}如果(myservo.attached()){val=模拟读取(potpin);//读取电位器的值(0到1023之间的值)val=map(val,0,1023,0,180);//缩放它以与伺服器一起使用(值在0到180之间)myservo.write(val);//根据缩放值设置舵机位置Serial.print("段:");Serial.print(segment);Serial.print("锅:");Serial.println(val);延迟(15);//等待伺服到达那里}}另外,我们还需要设置我们的RTC的时间!这是用于执行此操作的以下代码。//DS3231_Serial_Easy//版权所有(C)2015Rinky-DinkElectronics,HenningKarlsen。保留所有权利//网站:http://www.RinkyDinkElectronics.com/////关于如何使用我的DS3231库的快速演示//通过串行链接快速发送时间和日期信息////要使用Arduino的硬件I2C(TWI)接口,您必须连接//引脚如下:////ArduinoUno/2009://----------------------//DS3231:SDA引脚->Arduino模拟4或专用SDA引脚//SCL引脚->Arduino模拟5或专用SCL引脚////阿杜诺·莱昂纳多://----------------------//DS3231:SDA引脚->ArduinoDigital2或专用SDA引脚//SCL引脚->ArduinoDigital3或专用SCL引脚////ArduinoMega://----------------------//DS3231:SDA引脚->ArduinoDigital20(SDA)或专用SDA引脚//SCL引脚->ArduinoDigital21(SCL)或专用SCL引脚////Arduino到期://----------------------//DS3231:SDA引脚->ArduinoDigital20(SDA)或专用SDA1(Digital70)引脚//SCL引脚->ArduinoDigital21(SCL)或专用SCL1(Digital71)引脚////使用时内部上拉电阻将被激活//硬件I2C接口。////您可以将DS3231连接到任何可用的引脚,但如果您使用任何//除了上面描述的内容之外,库将回退到//基于软件的、类似TWI的协议,需要独占访问//使用的引脚,您还必须使用适当的外部//数据和时钟信号上的上拉电阻。//#include//使用硬件接口初始化DS3231DS3231rtc(SDA,SCL);无效设置(){//设置串行连接Serial.begin(115200);//如果您使用的是ArduinoLeonardo,请取消注释下一行//while(!Serial){}//初始化rtc对象rtc.begin();//以下几行可以取消注释来设置日期和时间//rtc.setDOW(FRIDAY);//设置星期几为星期日rtc.setTime(23,05,0);//将时间设置为12:00:00(24小时格式)rtc.setDate(7,19,2021);//将日期设置为2014年1月1日}空循环(){//发送时间Serial.println(rtc.getTimeStr());//在重复之前等待一秒钟:)延迟(1000);}以上就是关于这个项目的全部分享了,欢迎留言交流。