基于诺基亚3310显示器的自行车速度表的开发

近来,所谓的数字自行车速度表(自行车计算机)已经在自行车配件中普及。 这些设备能够测量许多参数,其中主要是速度和距离。 测量速度的原理是基于车轮旋转周期的计算,而距离是基于测量这种旋转数来计算的。 车轮转速传感器通常是与轮辐上的磁铁配合的舌簧开关。 取决于功能,此类设备的价格差异很大。 最便宜的自行车速度表的价格约为500 p。

我一直渴望拥有类似的设备。 同时,我制定了一些我自己的要求,这些要求应该满足。 首先,我真的很想查看速度变化的图表,该图表取决于距离或运动在短时间内累积的时间。 并且,为了在存储设备上记录(记录)测量结果以将统计数据进一步传输到计算机,可以更详细地查看它们。 便宜的型号不能完全满足我的要求,但是我不想为昂贵的型号多付钱。

基于以上所述,我决定基于ATmega8微控制器创建自己的自行车速度表。 有很多问题,尤其是有关所使用的外围设备的问题。 我偶然发现了曾经使用过的诺基亚3310手机使用显示器的文章,在阅读了数据表并确保其操作简单之后,毫无疑问,车速表将在带有上述显示器的手机机身上制成。 情况很好,而且设备本身并不难找到。



作为记录测量统计数据的ROM,我决定安装经典的24XX512 ROM(512 Kbps),该ROM通过I2C接口进行控制。 我没有理会使用SD / MMC存储卡。 设备中的另一个重要功能是手表。 它们用于将某些测量的特定参数(例如,最大速度)绑定到日期和时间,并且对于在统计信息中记录时间戳也是必需的。 作为时钟,我使用了来自微控制器的单独的实时时钟(RTC)芯片,该芯片具有独立的电池电量,并且还通过I2C与控制器进行通信。

在编写程序的阶段,我在设备的功能上实现了其他辅助要求。 这包括各种组织问题:涉及的按钮数量,各种元素在显示器上的位置,界面上的导航等等。 在导航方面,我事先决定不使程序复杂化,例如,不执行设置菜单,特别是日期和时间设置。 时钟设置一次。 由于采用了32.768 KHz的石英和可长时间使用的电池,因此时钟在RTC芯片本身中独立地滴答。 日期和时间设置是通过车速表的UART接口进行的,该接口一键连接到计算机的COM端口。 通过同一接口,应该将统计数据从ROM读取到计算机。 为此,您必须为计算机编写适当的程序。 但是,如进一步的实践所示,后者必须放弃。 首先,存在在编写计算机程序的阶段实现从控制器到计算机的数据接收的问题。 而且,更重要的是,控制器程序的数量增加了。 将ROM(位于SMIC外壳SOIC-8中)放在与SIM卡相对应的可移动平台上,并在手机上使用适当的空闲插槽,这是非常有趣的。 为此,必须根据I2C ROM编程器的一种众所周知的方案,基于SIM读取器制造ROM读取器。 后来证明,这一决定并未造成不必要的不​​便。

另一个重要问题是在图形显示器上输出符号(包括数字)信息。 这需要有关特定符号的图形信息。 该信息与诸如所显示的字体的大小之类的参数密切相关。 为了显示主要参数,即移动速度,为了清晰起见,最好使用大字体。 但是,如稍后将显示的那样,这种大约十位数的图形信息将不适合MK的内存,并且使用相同的外部容量更大的ROM将减慢绘制字体的速度。 我决定使用高度为8点的字体作为最大字体。 我从MS DOS的某个程序的文件“ 8X8.FNT”中提取了该字体的图形信息,之前已对其结构进行了分解并进行了进一步处理。



后来在实践中证明,此大小足以使速度清晰。 作为其他字体的大小,我选择了3x5大小,并独立绘制了该大小数字的图形。 这些小数字显示其他参数:日期/时间,平均和最大速度,路径。

两种字体的图形信息都存储在某些二维数组中。 每个大小为1个字节的数组元素表示特定数字的特定列的像素分布。 对于大字体,每个数字分配8列,对3位数字分配3列。对于3X5的小字体,正式高度不是5,而是8点(四舍五入到一个字节)。 这使您可以使用4种可能的方法之一在垂直方向上将8位字体的位置预先安排在8位区域内。 这些事实很好地显示在下图中,该图演示了此字体的前两位数字的图形建模。 Excel以建模而闻名。 初始数据是所需图形在适当字段中的“单位”排列。 其中,公式计算数组的值,直到C语言代码为止,然后可以将其复制到微控制器的程序文本中。



现在我们将讨论所用显示器的控制功能。 该显示器是单色的,其尺寸为84 x 48像素。 MK的显示控制通过SPI接口执行。 SPI传输的字节在显示中以两种模式解释:显示字节和配置命令字节。 这些模式由MK自己为特定的显示引脚(D / C)设置。 显示屏上的数据表中提供了命令的完整列表。 这些命令中的一些已在我的设备中使用,并在设备加电后用于初始化显示:温度系数,对比度,顺序绘制模式(水平或垂直)等。 我马上注意到应用了水平绘图模式。 这意味着在显示模式下传输字节时,地址会自动向右逐行增加。 该行结束时,位置地址将移至下一行的开头。 首先将特殊的定位命令发送到显示器到特定的行和列地址(初始位置),然后依次依次发送数据字节以显示图形就足够了。 值得注意的是,地址空间的功能和图形的解释取决于显示器接收的字节数。 我注意到,对于单色图形,一个字节一次包含有关八个像素的信息。

所涉及的显示被垂直划分为6个水平区域,每个区域有8行(6 * 8 = 48)。 每个区域的每一列将对应一个特定的字节,该字节与对应列的地址(0 ... 83)和区域编号(0 ... 5)一起发送。 从头开始,地址不从一开始就计算在内。 例如,如果将自己放置在地址(34; 2)上并发送255的数据字节(二进制格式为“ 11111111”),则所有8个像素在垂直方向上从16点亮到23,在水平第35列上点亮。 我认为,此功能有一个缺点:无法在硬件级别单独控制每个像素的状态。 字节是图形的最小数据段。 当一个字节发送到当前地址时,当前区域中的所有8个对应像素都将更新。 显示器不支持向微控制器读取当前显示的图形信息。 因此,如有必要,有必要事先将输出信息存储在专用缓冲​​区中,并更改任何像素(位)的状态,对来自该缓冲区的字节应用位掩码,然后将其再次传输到显示器。

考虑到上述特征,对显示器上的特定图形信息的位置进行了建模和思考。 这样做是为了简化编写程序时的代码。 绝非偶然的是,字体大小是从类别8、16、24(即8的倍数)考虑的。我还通过类似于显示的方式将图形信息划分为6个水平区域。 在第一个区域中,以小字体显示绝对值和当前值(从设备打开电源起)。 在第二个区域中,路径的绝对值和当前值(以公里为单位,四舍五入到百分之一)。 在第三区-平均速度。 第四行-最大速度,大字体显示-当前速度。 在第五个区域中,将显示两个进度条,以指示ROM已满和被覆盖的次数。 在第六个最后一个区域中,日期和时间。 当在任何拍摄列的垂直方向上存在与不同信息相关的像素时,则是第五区域是例外。 因此,使用位掩码的此信息收集在缓冲区中,然后将其内容显示在此第五区域中。 同样,在3-5个区域中,存在用于在显示的速度值周围绘制框的信息。 在最后一个区域中,所有列的每个第一(最低有效)位都设置为“ 1”以绘制分隔线(第40行)。 为了进行地址的模拟和可视化,我在Excel单元格中描述了以上所有内容。



这是第一个显示窗口的外观。 只有两个窗口。 第二个窗口是运动图(直方图)的输出。 为此,垂直分配了5个区域(40行),水平分配了所有84列。 带有时钟的第六个区域在两个窗口中都相同。

在编程时,我决定不求助于使用任何库来处理此显示。 就个人而言,我比理解库更容易理解数据表,自己实现部分功能。 此外,在此发现了某些优点。 最近,尽管下载了其中一个库,但我仍然弄清楚了它的功能。 它是通用的,借助它的帮助,您可以单独控制像素并将自己定位在实际像素地址上。 但是该库使用大小为84 * 6字节的缓冲区,并且此计时器缓冲区会定期发送到显示器,以更新图形。 因此,计时器和存储器MK的一部分繁忙。 在我的特定情况下,无需使用库,因为在建模时,我会事先注意使显示区域之间的信息分离最大化,这完全符合显示区域。 无需定期更新显示屏上的信息:仅当且仅当信息更改时(信息轮每次旋转,每按一次按钮等),信息才更新。 因此,我再次强调:根据任务,您可以避免使用任何库。

为了使用时钟微电路和ROM,我也没有求助于库的使用:所有功能都非常简单,并且在研究了这些组件的数据手册后由我实现。

现在考虑设备的电路。



车速表的布局相对简单。 除上述所有功能外,该电路还包含一个IC5 MAX756元件,该元件可作为3至5伏的电源转换器,以从Nokia 3310手机的原始电池提供可靠的电源;由于缺少合适的MK和外围设备,我没有为3伏的电源实现该电路。 目前,我还没有购买MAX756,整个电路仍由使用LM7805稳压器的外部Krona电池供电(并非最佳选择)。 它连接到手机底部的耳机插孔。 簧片开关SF1是车轮旋转传感器,连接到INT0 MK中断端口(引脚32)。 它从手机底部牢固地连接到充电端口。 连接到移动电话的按钮“ 1”,“ 2”,“ 3”的功能按钮S1-S3连接到任意端口(引脚23、27、28)。 引脚S4连接到MK重置的引脚29,该引脚与用于打开手机电源的上端按钮重合。 我就是那样做的。 设备本身没有待机模式,因此可以打开电源。 一个IC2显示器和一个用于使X1闪烁的连接器已连接到控制器的SPI端口(引脚15-17)。 使用连接器时,我想在原始主板上现有的“位置”基础上制成与PC(在同一位置)配对的连接器,但遇到了一点麻烦,将来我会将其转移到另一个位置。 用于用户连接到计算机的UART接口连接到同一连接器,通过该接口可以配置设备上的日期和时间(引脚30-31,RX / TX)。 显示器通过电阻上的分压器连接至控制器,该分压器用于降低电压,因为显示器的工作电压为3.3V。此外,显示器引脚D / C(数据/命令),SCE(选通)和RES(显示器复位)连接到任意端口。 MK PB0,PB1和PB2(引脚12-14)。 显示器通过二极管D1-D3和电阻R6供电,二极管D1-D3和电阻R6的作用是将电压从5 V降低至3.3 V,从而避免使用线性稳压器。 由MK计时的标称值为4.5 MHz的石英Cr1是随机选择的,是有意选择的。 他只是掉进了我的手臂,我决定使用它。 晶体管Q1和Q2连接到PD4和PD5 MK的端口(引脚2和9),显示器和键盘的背光LED加载到该端口。 控制器提供了单独控制背光的功能,就像移动电话的原始布局提供的(在硬件级别,而不是在用户级别),尽管实际上这不是必需的。 I2C总线连接到PC2-PC3端口(引脚25-26),为简单起见,使用适当的库以编程方式实现(尽管它已连接到硬件TWI端口)。 IC3 ROM和实时时钟(RTC)IC4挂在总线上。 立即做出保留,以免评论中受到批评:我知道DS1307不是最佳解决方案,但是在电路开发时,我还不知道DS3231的存在。 ROM位于类似于SIM卡的可移动连接器上。 PC1控制器的另一个端口(引脚24)用于通过RTC接收频率为1 Hz的脉冲,由此更新显示屏上的时间。 所有无源车身套件组件-根据每个有源组件的数据表。

考虑计算某些参数的数学考虑。 如开始时已经提到的,测量速度的原理是基于计算车轮的旋转周期,而距离是基于测量这种旋转数来计算的。 控制器测量从簧片开关到上一个脉冲与输入脉冲之间的时间。 通过将车轮周长的值除以旋转周期,可以将测量结果转换为速度值,并在每个脉冲(车轮旋转)的显示上更新该值。 在此值得注意的是,从物理学的角度来看,计算出了在与车轮周长相对应的路径部分上自行车的平均速度。 分别计算脉冲数,然后将其转换为距离值。 为了测量车轮的旋转周期,控制器使用其自己的计时器。 ATmega8有一个8位和16位定时器。 测量的动态范围取决于计时器的位深度。 在我的情况下,使用16位计时器,因为8位(256个计数)绝对不足。 最大测量周期(在定时器溢出之前)将对应于最小测量速度。您可以输入所谓的软件计时器,它将测量大量时间。但是,为了简化程序,我没有这样做。在计时器配置中使用4.5 MHz的石英和最大分频器值为1024时,我们具有:(1 /(4500000/1024))= 0.000227556秒。此值对应于帐户的最短期限。并且最大帐户期限为0.000227556 * 65536 = 14.913秒。与最小可测量时间相对应的最大可测量速度将约为30,000 km / h。这甚至都不值得规定,“自上而下的储备”是巨大的。但是对应于最大测量时间段的最小测量速度将为2.26 / 14.913 / 1000 * 3600 = 0.54 km / h。在我的案例中,这里的车轮周长为2.26(以米为单位)。我对这个最小测量值感到非常满意。如果自行车以小于0.54 km / h的速度运动,则自行车速度表将记录运动不足(以及计时器溢出)。使用此石英4.5 MHz UART接口,可以在2400波特的速度下正常工作,并具有可接受的可接受误差。这种速度也足够了,特别是因为我使用UART从计算机进行一次时钟设置(用于将日期和时间从计算机复制到设备)。如果您以更高的频率采集石英,则最小测得的速度将增加,这对我来说是不可接受的,并且需要使用软件计时器。而且,如果您在下面进行介绍,则设备的整体性能会下降。因此,我决定离开这个特殊的石英。使用此石英4.5 MHz UART接口,可以在2400波特的速度下正常工作,并具有可接受的可接受误差。这种速度也足够了,特别是因为我使用UART从计算机进行一次时钟设置(用于将日期和时间从计算机复制到设备)。如果您以更高的频率采集石英,则最小测得的速度将增加,这对我来说是不可接受的,并且需要使用软件计时器。而且,如果您在下面进行介绍,则设备的整体性能会下降。因此,我决定离开这个特殊的石英。使用此石英4.5 MHz UART接口,可以在2400波特的速度下正常工作,并具有可接受的可接受误差。这种速度也足够了,特别是因为我使用UART从计算机进行一次时钟设置(用于将日期和时间从计算机复制到设备)。如果您以更高的频率采集石英,则最小测得的速度将增加,这对我来说是不可接受的,并且需要使用软件计时器。而且,如果您在下面进行介绍,则设备的整体性能会下降。因此,我决定离开这个特殊的石英。我使用UART从计算机进行一次时钟设置(用于将日期和时间从计算机复制到设备)。如果您以更高的频率采集石英,则最小测得的速度将增加,这对我来说是不可接受的,并且需要使用软件计时器。而且,如果您在下面进行介绍,则设备的整体性能会下降。因此,我决定离开这个特殊的石英。我使用UART从计算机进行一次时钟设置(用于将日期和时间从计算机复制到设备)。如果您以更高的频率采集石英,则最小测得的速度将增加,这对我来说是不可接受的,并且需要使用软件计时器。而且,如果您在下面进行介绍,则设备的整体性能会下降。因此,我决定离开这个特殊的石英。

我注意到周期和速度值成反比,并且微控制器计时器离散地测量周期。在我们的示例中,测量范围(0.000227556 ... 14.913)均匀地用65535的点标记,将其划分为许多相等的间隔。这些点对应于各种测量值。使用从时间到速度的间隔转换,该间隔系统从均匀转换成反比例。因此,将各种测得的速度范围分为不均匀的间隔。这些间隔的长度随着速度值本身的增加而增加。鉴于这个事实,我写得更高的巨大“自上而下的储备”将是不可行的。实际上,对于自行车的最大测得速度,采取100 km / h的值就足够了。这只是为了不引入新的数字(数百个)并且不增加显示器上显示的参数的宽度。我们以某个邻域速度计算相邻可能值之间的间隔长度等于例如90 km / h。使用逆公式或选择,很容易计算出,对于计时器397的值(可能为65536),测得的速度对应于90.06 km / h。并具有398-89.83 km / h的相邻计时器值。速度之间的差异为0.23 km / h,已经可以接受。在较低的速度下,这种差异会更小。显示屏显示速度值至最接近的百分之一。但是,实际上,四舍五入到最接近的整数或十分之一就足够了。从以上所述,我们可以得出结论:可以忽略速度的“网格”的不均匀性,因为由此引起的测量误差不会超过允许的误差。

要计算距离,只需将脉冲数(转数)乘以砂轮周长即可。当然,在这种情况下,距离的计算精确到了车轮的周长,这是完全可以接受的。当前平均速度的计算方式为:当前距离与打开后的时间值之比。这是控制器考虑通过使用RTC每秒计数一次的脉冲数来考虑的时间。显示屏上的平均速度与时间更新(每秒一次)一起更新。车轮每转一圈,所有其他参数都会更新。

现在介绍界面的小功能。第一个按钮用于切换模式(图形模式或值显示模式)。第二个按钮-显示绝对(所有时间)最大速度,而不是按住时的相对最大速度。此外,将显示达到此速度的日期和时间来代替当前日期和时间。而且,显示当前ROM地址的值来代替相对速度的值(用于控制)。可以通过显示屏第38行上的水平进度条估计该值。在容量为65536字节(512 kbit)的ROM上,记录了测得的参数。如后面将要说的,用初始时间的标记来记录初始测量的参数(车轮的旋转周期)就足够了。在ROM扫描阶段,计算机程序可以轻松计算所有其他参数。第三个按钮用于控制背光。与上面的屏幕草图不同,我后来删除了辅助参数上的无关紧要的零,以更清楚地显示它们。在图形模式下,从左到右绘制运动速度的直方图,这清楚地说明了在车轮84转的一小部分距离内改变速度的过程。直方图的值是速度,每1 km / h为1像素。如果速度超过40 km / h,图像将垂直缩小2倍,以免超出比例。无需在此描述设备行为的完整功能。后来我删除了次要参数上的无关紧要的零,以更清楚地显示它们。在图形模式下,从左到右绘制运动速度的直方图,这清楚地说明了在车轮84转的一小部分距离内改变速度的过程。直方图的值是速度,每1 km / h为1像素。如果速度超过40 km / h,图像将垂直缩小2倍,以免超出比例。无需在此描述设备行为的完整功能。后来我删除了次要参数上的无关紧要的零,以更清楚地显示它们。在图形模式下,从左到右绘制运动速度的直方图,这清楚地说明了在车轮84转的一小部分距离内改变速度的过程。直方图的值是速度,每1 km / h为1像素。如果速度超过40 km / h,图像将垂直缩小2倍,以免超出比例。无需在此描述设备行为的完整功能。直方图的值是速度,每1 km / h为1像素。如果速度超过40 km / h,图像将垂直缩小2倍,以免超出比例。无需在此描述设备行为的完整功能。直方图的值是速度,每1 km / h为1像素。如果速度超过40 km / h,图像将垂直缩小2倍,以免超出比例。无需在此描述设备行为的完整功能。

值得注意的是,我的车速表和廉价购买车之间的特征差异之一。它包括更新显示屏上速度指示的速度。在我的设备中,轮子每次旋转时,都会根据计算立即更新。在购买的设备中,它会以一定的延迟进行更新。也许此延迟是由于尝试过滤测量噪声(例如,使用移动平均法)以稳定显示屏上的速度显示以获得更详细的清晰度所致。或者,也许会定期更新显示(例如,每秒两次)。可能很方便,但是我想在车轮每转一圈时进行一次速度更新。

印刷电路板通过LUT方法制成二手手机的原始电路板形式。在电路板的制造中,我使用了SLayout程序。同时,我预先在扫描仪的两侧拍摄了原始板的照片,并将图像作为模板放在SLayout中。为了在专用的必要位置绘制用于连接显示器,按钮和连接器的垫板,这是必要的。在板的制造中,出现约0.5mm的误差。事实证明,在组合焊盘和元件方面该错误是可以接受的。但是,此错误影响了背光灯的质量:密封的LED偏移了几毫米,并没有落在光散射心轴的焦点上。因此,背光灯的亮度降低,效率降低。下图显示了SLayout中的电路板以及SIM卡形式的用于ROM的三个小型印刷电路板的视图。另外,示出了从两个侧面对原始印刷电路板的扫描。





某些元件(按钮,连接器)通过细线跨接器互连,从而缺乏铺设轨道的能力。所有可用按钮都有一个边距,即可以使用任何可用按钮。将中间的大按钮设为切换显示模式的按钮可能会很方便。在板的左上角是一个3伏RTC动力电池。通常,板上所有元件的尺寸与外壳尺寸保持一致,才能正确放置。与镀金的原件不同,内部电路板上涂有普通焊料。如最初的实践所示,与显示器和其他外围设备的接触不会丢失。

事实证明,MK程序很大,并且占用了很大一部分内存。此外,该程序还提供了使用其自己的控制器非易失性存储器(EEPROM)来记录和保存必要信息的功能。下表显示了此信息通过EEPROM地址的分布。

住址尺码资料
04n(对于S)
42t_min(对于v_max)
66t_min的日期
122地址EEPROM
141个EEPROM RW计数
12880数字8X8
20830数字3X5
前四个字节将行进的距离存储为车轮的转数。 我特别为此变量选择了32位整数类型,因为在实践中,所经过的路径的值相对较大。 例如,一个整数16位变量最多可以保存65,536转(约148 km),这自然很小。 跟随两个字节以保持绝对最大速度。 实际上,节省了最小的车轮旋转时间。 该变量占用两个字节,因为其值是测量16位计时器的结果。 接下来的6个字节是达到上述最大速度的日期和时间。 数据完全以从RTC芯片读取的格式显示(不包括星期几)。 接下来,两个字节存储外部ROM当前地址的值。 这是一种指针,对于在下次上电后继续在ROM中写入统计信息是必需的。 MK应该知道它最后一次停止在外部ROM地址空间的哪个位置。 MK将从该位置继续记录。 由于外部ROM的地址空间为16位,因此分配了2个字节的值。 这是从64 kB ROM大小开始的。 接下来是一个单字节变量,用于存储ROM覆盖次数的值。 当上述指针达到最大值并变为零时,将覆盖。 在这种情况下,新接收的信息将从一开始就被记录下来,从而擦除旧信息。 整数单字节变量最多可以存储256个值。 我提醒您,显示屏上的两个进度条可以直观地指示ROM地址指针的值和覆盖次数。 此外,在EEPROM MK的大备份空间之后,从地址128开始,存储了关于8×8位的图形信息。 为此,分配了80个字节(如前所述,每个数字8个字节)。 最后,从地址208开始,存储了30个字节,以获取有关3x5小数字(每位三个字节)的图形信息。

除了微控制器的主程序外,我还为计算机编写了三个辅助程序,下面将对其进行讨论。 所有程序都没有图形界面,并且可以从Windows XP的命令行运行。

第一个程序允许您通过COM端口将日期和时间从计算机复制到自行车速度表。 自行车速度表通过MAX232芯片连接到计算机。 程序使用WinAPI,以SYSTEMTIME类型的特殊结构变量接收当前日期和时间。 从该变量中提取十进制格式的当前日期,月份,年份,星期几,小时,分钟,秒。 所有这些数字(年份除外)均不超过小数点后两位(小于100)并且在一个字节内。 通过从年份中减去当前千年的值2000,可以将年份的值转换为两位数。 这些两位十进制数字中的每一个都转换为RTC芯片的二进制十进制格式特征。 以这种格式,两位数字也占用一个字节的体积。 最高有效4位被编码为十位数,最低有效位被编码为单位数。 随后,根据我之前确定的协议,由这些数字组成一个13字节的包裹。 根据标准ASCII编码,前五个字节代表单词“ TIME =”。 然后按照秒,分钟,小时,星期几,日,月,年。 最后一个字节是“#”字符,作为消息字符的结尾。 该程序包通过COM端口从计算机发送到设备。 微控制器程序根据上述格式接收软件包并检查其正确性。 如果前五个字节为“ TIME =”,最后五个字节为“#”,则认为发送正确,并且内部字节按相应顺序解释。 在不更改此字节字符串的情况下,控制器通过I2C总线将其发送到RTC芯片,并为当前日期和时间进行配置。 我注意到,该微电路支持计算从1到7的星期几,尽管作为确定日期和星期几对应的日历,事实并非如此。 我没有在设备中提供有关星期几的信息显示。

第二个程序旨在处理来自外部ROM内容的数据。 最初,假定应该使用一些与知名MK和ROM编程器一起工作的知名程序(例如“ icprog”)将该内容从ROM复制到映像文件。 但是,在更详细地研究了I2C操作原理之后,我设法实现了此功能并将其包含在程序中。 下图介绍了我在设备中使用的该系列ROM编程器的方案。



ROM连接到计算机的COM端口,该端口不用作通过RS-232交换信息的方式(足以使用TX,RX,GND的输出),而是用作逻辑信号的任意输入输出的方式。 ROM通过TX端子供电,ROM由78L05稳压器稳定至5V。 通过控制计算机的TX输出,我们可以打开或关闭ROM芯片。 SCL单向时钟线集中在COM端口的RTS引脚上,而SDA双向数据线集中在两个引脚上:CTS(数据接收)和DTR(数据传输)。 电阻和齐纳二极管D1和D2用于将信号电平限制为ROM,而ROM在TTL上工作。

我是为我的特殊情况而设计的这种标准编程器,它使用损坏的手机中的SIM卡读取器代替ROM的插槽。



通过WinAPI,程序访问计算机COM端口的引脚,设置它们所需的值(0或1),并从CTS引脚中从ROM中删除传入的二进制值。 基于此工具包,I2C功能是根据相关规范实现的,我将不对其进行详细介绍。 该程序可以将ROM的内容读取到文件映像中(就像常规编程器一样),还可以处理此类文件,或直接从ROM处理信息。 信息处理包括基于来自ROM的输入信息以预定的表格格式获取输出统计文件。 每个此类文件对应一个行程(从当前时刻到设备下次开启)。 首先,我将简要介绍我预先定义的输入格式。 每次打开设备电源时,会将两个字节的零写入当前地址,该地址从微控制器的EEPROM中读取。 超时后或打开设备电源后,当砂轮开始旋转时(第一个脉冲),当前日期和时间将以二进制十进制格式写入(因为它存储在RTC芯片的寄存器中)。 然后记录两个字节的“单位” 0xFF。 在车轮旋转过程中,对于每个第k个脉冲(k = 2,3,...),两个字节(高和低)记录车轮在第(k-1)和第k个脉冲之间的旋转时间。 显然,此信息足以将当前(而非绝对)行驶距离以及速度与日期和时间相关联。 输出格式为文本,并且是* .csv文件中的表格表格,可以通过双击鼠标在Excel中打开它们。 该表中的行与车轮转数相对应,列值如下所示。

ADRROM地址值
日期/时间开始日期和时间
十二月小数计时器值
时间当前时间
Ť自上电以来的行程时间
v速度
ñ速度
小号方式
一个绝对转数(仅在当前ROM中)
S绝对路径(仅在当前ROM中)
n_day当日转数
S_day当日的路径
v_max当前行程的最大速度
av_max绝对最大速度(仅在当前ROM中)
v_mid当前行程的平均速度
下图显示了Excel中此类文件内容的屏幕截图。 此外,还显示了在一个坐标系中各种颜色的电流,平均速度和最大速度的变化图。 参数(X轴)-速度值作为输入数据。 该图显示了前730转的参数变化。 行驶的距离与此可变的线性相关性相关(730转对应于大约1650 m)。 因此,可以说,这些图反映了速度对距离的依赖关系(精确到水平比例),而传统的速度对时间的依赖关系则应引起注意。 如前所述,此功能归因于通过轮速测量速度的思想和原理。 但是毕竟,车轮的每转都会分配一定的时间(磁铁和簧片开关接近的时间)。 自然,此时间戳序列并不统一。 但是,为了形式和方便起见,Excel能够在路径或当前时间中指定时间值数组作为图形的参数。 但是,尽管如此,应该记住,速度与时间的实际依赖关系(对于离散情况,以统一的时间间隔)在水平刻度可变的情况下看起来会有所不同。





下图显示了转速对转速的相同依赖关系,但已经使用了移动平均法的滤波器,其窗口宽度为11转。 所有图形均使用众所周知的方法在Excel中构建。



比较速度变化的两个图,很明显,滤波后的图不存在高频分量,即 噪音已消除。 我认为,11圈(约25 m)的移动平均窗口的宽度太大。 如果您真的提出了从噪声中过滤读数的问题,那么只需较小的窗口宽度即可,例如,等于3。 该算法可以并入自行车速度计程序中,因为它不仅可以用于分析读数,还可以实时显示这些读数。 尽管该算法很简单,但由于该主题已涵盖在数学过程中,因此不在本文的讨论范围之内,因此我将不对其进行详细描述。 这是关于平均速度的另一个说明。 正如我已经写过的,平均速度是唯一不随车轮每转一次而是每秒钟更新一次的参数。 我这样做是为了确保即使缓慢移动,显示屏也能显示平均速度的变化。 因此,显示器上实时读取的值与将来在扫描ROM时由计算机程序计算出的值会稍有不同。 绝对速度,绝对路径和绝对最大速度的读数也将有所不同。 显示屏在输出表中显示了真正的绝对值(在设备的整个使用寿命内),并且仅在当前ROM的读取范围内。

本质上,第三个程序是与固件微控制器相同的程序。 我可以使用连接到计算机LPT端口的最简单的STK 200编程器,或者可以使用它的模拟物(如果可以调用它的话),因为在最简单的情况下,编程器不包含任何活动元素。 实际上,MK通过SPI接口直接连接到LPT端口的特定引脚,并作为从设备工作。 该程序根据其数据表实现了与ATmega8控制器交换数据的协议(第237页)。 通过使用著名的动态库“ inpout32.dll”管理LPT端口寄存器来实现SPI物理层。 我的库不是作为项目连接的(因为我避免通过创建一个简单的“文件”在“ Dev-cpp”中创建这样的项目),而是使用了使用HINSTANCE结构类型的LoadLibrary函数。 “ inpout32.dll”库被映射到这种类型的变量,随后该库中指向函数的指针被提取到单独的变量中。 Inpout32.dll只有两个函数负责数据的输入和输出。 使用预提取的指针可以访问这些功能。 LPT端口引脚使用位掩码单独控制。 在我的特定情况下,我编写的程序可与控制器的EEPROM区域配合使用,旨在读取,保留,写入,校正和从我先前绘制的存储在其中的数据的备份副本中还原。 像所有其他程序一样,该程序从命令行运行。 在这种情况下,为了实现程序的多功能性,将使用“切换大小写”功能和文本用户对话框,例如,“对操作1输入'1',...,输入'0'退出程序。” 数据以各种方便的格式显示。 除上述内容外,该程序还可以在屏幕上以512字节显示EEPROM控制器的完整转储。 此外,该程序还可以记录有关控制器内存中使用的字体的图形信息。 如果是小字体(3X5),程序将从文本文件“ Fonts 3X5.txt”(与它位于同一目录中)中获取信息。 该文件包含以十六进制格式写入的30字节(3乘10)的表格表。 如果需要,可以在文本编辑器中轻松编辑它,从而更改此字体的图形。 如前所述,这种小字体非常简单,以至于无法更改其图形。 唯一的事情是,可能仅需要垂直移动,因为有一个高度为8像素的空白空间,并且字体的高度等于5。对于大字体,大小为8X8(显示当前速度)的情况,我提供了更有趣的功能。 关于此字体的图形信息不是以字节表形式显示在文本文件中,而是以图形可视BMP文件形式显示。 每个数字对应一个这样的文件。 它的参数是8X8大小,单色和黑白调色板。 下面是著名图形编辑器“ MS Paint”的屏幕截图,其中打开了“ 8.bmp”文件。



根据经验,我研究了从MS Paint获得的单色BMP文件的结构,在此基础上,我学会了读取单色BMP图像的每个像素(不包括使用结构和辅助库)。 在自下而上的水平逐行读取阶段(这是BMP文件的结构的组织方式),程序将信息转换为特定于所用显示器的垂直格式。 一次执行此操作,其中使用位掩码和变量值的累加。 下面,我将展示第i个数字的代码部分,并注意该过程的简单性。

for(k=0; k<8; k++){ fnt[i][k] = 0; } for(j=0; j<8; j++){ fseek(f, 62+4*j, SEEK_SET); byte = ~fgetc(f); for(k=0; k<8; k++){ if(byte & pow2(7-k)){ fnt[i][k] += pow2(7-j); } } } 

在第一个循环中,将fnt数组的元素初始化为零。 此外,该数组的第k个元素(k = 0 ... 7)对于第i个数字(i = 0 ... 9)将携带有关每个对应数字的每个对应列的图形信息。 下一个周期是沿着BMP文件图像的路线运行。 使用fseek运算符,我们将字节定位在预定义BMP文件f的偏移量62 + 4 * j处。 根据行号j计算偏移量的公式的特殊性由BMP文件的结构确定。 在字节中间变量中,我们获得上述偏移量处的字节值。 该字节存储有关当前行j中单色图片的所有八个像素的信息。 “〜”运算符对字节执行逐位反转,从而导致每个像素的颜色反转。 这是由于以下事实:单色BMP文件的调色板中的黑色像素对应于逻辑“ 0”,而白色对应于逻辑“ 1”。 相反,在应用的显示中。 在嵌套循环中,将对字节进行字节分析,并同时在fnt输出数组中累积信息。 函数pow2-将2提升为非负整数幂,独立编写。 除了此功能,您可以使用更高效的按位移位运算符“ <<”,但是在编写此程序时,我并未使用它。

此外,该程序还能够将MK的内存写入我选择的几种图形选项之一。 这些选项通过使用名称(格式为“ v1”,“ v2”,“ v3”等)的目录(文件夹)来实现,这些目录位于与程序相同目录中的“ Fonts 8X8”文件夹中。 这些文件夹中已经有必要的BMP文件。 由于具有上述功能,因此可以在图形编辑器中从“空白表”中更正或绘制数字,从而在目录之间进行保存和分配。 我有三个字体选项。 第一个选项是原件。 第二个-像原始的一样,但是带有一个划零的零和一个修改的单位(没有下划线)。 第三种是带有矩形边框的字体。

下图显示:设备背面的制造电路板; 桌上有电源的设备(带有非最终版本的固件); 安装在自行车上并显示速度变化图的运行中的设备。







然而,在设备的操作过程中,发现了与制造特征相关的小缺陷。 首先-显示器与印刷电路板的焊盘接触不良。 在原始手机中,板上的触点镀金,并且没有氧化。 就我而言,它们只是镀锡的。

根据前述内容,决定在另一种情况下重新制造该装置,以及重新制造将在其上焊接显示器的印刷电路板。 我最近开始了这个过程。 结果是更坚固的设计。







我在CNC铣床上用一块厚度为17毫米的有机玻璃为设备制作了外壳。 为此,我初步在SPlan程序中草绘了案例的草图,几乎完全不了解图纸,CAD等的主题。



这些草图是一般表示和获取控制点坐标所必需的。 在此基础上,考虑了铣削的一般原理和顺序,为CNC机床编写了程序。 我使用自动完成功能重复执行操作,在Excel中手动编写了CNC程序。





我还稍微校正了设备布局,如下图所示。



除了键盘上已经不需要的背光灯外,还有一个LED指示灯可以随着转轮的转动而闪烁。 连接器也会重新绘制,并且在设计的更新版本中没有其他不需要的元素。 此外,我发现并安装了石英4.433619 MHz,稍稍校正了我自己程序源代码中的某些常数。 还对该程序进行了一些小的更改。

成品的照片如下。 该设备由自行车上的电池供电。 从中,还可以为黑暗中的旅行提供照明。



正是在这种设计中,该设备可以完全正常工作而没有任何故障。 唯一的缺点是使用了质量不是很高的RTC芯片:在冬季的低温下,时间很急,您必须每月进行一次调整。

Source: https://habr.com/ru/post/zh-CN414281/


All Articles