如何设置基于MTK3339芯片的Adafruit Ultimate GPS板以记录到sdcard,hdop 2024-04-12 05:23:06 0 0 步骤1: 1)Arduino Mega 2560 Sainsmart mega也可以使用。 2)LCD键盘防护罩http://www.hobbytronics.co.uk/arduino-lcd-keypad-s.。。 sainsmart键盘防护罩也可以使用。 3)adafruit终极gps记录器防护罩http://proto-pic.co.uk/adafruit-ultimate-gps-logge.。。 4)Arduino Stackable(Shield)接头套件-R3 http://www.hobbytronics.co.uk/cables-connectors/p 。。. 将引脚从单排插头连接器中拔出,并使用塑料为可堆叠的屏蔽插头创建一定长度的垫片 5)红色/绿色双色公共阴极,直径为3/5mm 6)Micro SD存储卡http://www.hobbytronics.co.uk/4gb-microsd?keyword = 。。. 7)用于LED电流控制的电阻器(取决于LED) 如果LED在5V电压下需要10 ma,则该电阻器为R = V/I = 5/0.010 = 500欧姆 8)塑料盒 我用15cm * 10cm * 5 cm,如果可以的话,它会变小 9)5.5mm Arduino直流电源插头http://www.hobbytronics.co.uk/cables-connectors/dc.。。 9)单声道3.5 mm唱头插座 10)面板开关(开/关额定适用于5v 500mA) 11)带有500mA快速熔断器的面板保险丝座 12)小橡胶脚垫(需要8个) 13)内径为3.3mm的10mm尼龙垫片http://www.hobbytronics.co.uk/hardware/spacers-was 。。. 这些完全适合LCD按钮以进行扩展。使用模型制作者超级胶水进行附着。 14)2-2.5mm带螺母和垫圈的螺栓(需要3个)用作Arduino的支撑柱。一根窄螺钉,长2厘米。 15)小长5毫米的定位销。小螺丝固定。 3-4小块塑料洗涤液。 16)硬木以适合盒子的底部。木材使两个底座支撑盒子的宽度。 17)电池-我使用了2节500 mAH LIPO。为此,您将需要 LIPO充电器 。 18)引线以匹配电池端子类型。 19)可选如果您计划添加外部arial,则UFA到SMA arial适配器电缆。 gps非常敏感-我还没有买过arial。 步骤2 :入门 阅读有关最终gps的adafruit文章https://learn.adafruit.com/adafruit-ultimate-gps/ 另一篇有用的文章https://learn.adafruit.com/adafruit -shield-compat 。。. 。 将4个小的橡胶脚安装到Arduino Mega的基座上: 这将提供稳定的安装表面。 避免安装孔。 。 将可堆叠连接器安装到gps板上: 确保使用GPS板中最外面的孔。检查所有东西的配合情况! 我将板子部分插入了arduino,然后将板子上下颠倒地焊接在每个部分的2个端针上。 必须小心不会使电路板过热。其余的引脚都焊接好了,然后拆下了电路板。 使用一段直的单行接头连接器,然后拉出引脚以制成隔离条。将隔板安装到GPS板上现在可堆叠连接器的4个部分中的每个部分上。 假设您使用的是Mega,请将轨道切成7、8和10针 》如图所示。用锋利的手术刀仔细切开。 。 安装GPS电池和SD卡: 插入电池,注意极性。 将预格式化的SD卡小心地滑入插槽,直至其固定到位。观察正确的对齐方式。 。 将3条导线连接到CCS,TX和RX : 我将导线弯曲备用的六向可堆叠连接器可旋转90度,并使用CSS/TX/RX将其焊接到该行中。 这使我可以根据需要轻松地移除引线。 直接导致。 。 添加双色LED: 检查双色LED的数据表并选择一个电阻提供正确的电流。确定线索的方向。 LED应该是共阴极型。 暂时将LCD板安装到GPS板上-小心地匹配孔! 使用尖头鼻子钳作为支撑来弯曲引线,以实现草图中的轮廓。 led应该将LCD屏幕的末端清除10-12mm,并在其上方到达4-5mm,以便从外壳中出来。 p》 建立引线轮廓和长度后,卸下LCD。 将LED,电阻器和3根导线焊接到GPS板的底面。 红色引到引脚2,绿色引到引脚3,阴极通过电阻0V。 。 将GPS板插入Arduino Mega: 如果您使用的是Sainsmart,则每侧都有2条导线在插座孔中-组装前,我将其略微向外弯曲,并将热缩管放在裸露的引脚上。 将3根引线连接至Arduino- RX至TX1,TX至RX1,SSC至引脚32(可以 将GPS开关设置为“ SOFT SERIAL”。 。 将LCD板插入GPS板: 在LCD板上的按钮旁边找到安装孔。小心地切一块5mm的木销,以将LCD的按钮端支撑在安装孔下方。它应该放在长凳上。按下按钮时,这将使LCD停止摇摆。 在插槽中放入足够的塑料垫圈以防止其闭合。将木杆拧入到位-使用良好的导向孔。如有必要,用砂纸/洗涤液调节高度。杆只应清除对Mega电源插座的访问。 步骤3:制作盒子 1)切一块硬质板以适合盒子的底部-至少允许移动2mm 2)将Mega放到底座上-小心地放置,以使距LCD屏幕的左边缘到盒子左侧的距离为15mm,距LCD的前边缘到PC正面的距离为35mm。框。标记并钻一个安装孔。 ink孔底座的底部。从底部安装2mm的螺母和螺栓。 重新放置Arduino并安装第二个孔-确保LCD与底座平行。 添加第三个螺母和螺栓。最终的安装座是从顶部到右下安装孔的螺钉。 剪切并适当地固定安装螺栓的长度。 3)将mega放在其安装座上。仔细测量盒子顶部和LCD顶部之间的高度。检查盖子下侧相对于LCD顶部的位置。 制作两个矩形滑道正确的深度以将LCD顶部放置 1-2 mm 盖子底部下方。 右手滑道必须位于螺丝孔的中心,以确保右下安装位置。 穿过底座顶部,以固定滑道。避开安装孔。 再次检查LCD相对于盖子的高度-不要盖上盖子-LED会弯曲! 4)钻出螺丝孔插入右手的滑槽中。在螺丝孔周围稍微埋入孔。切下一个10mm的尼龙垫片,以支撑电路板的右下部分。 5)将Mega的LCD平行于盒子的正面放置。使用沉头螺钉将底座从盒子的外部安装到每个流道中。 6)测量LED的位置。在盖子上钻一个小导向孔。检查LED的位置,并按照LED的间隙尺寸开孔。 7)测量并切掉LCD屏幕的孔-比LCD屏幕支架的外部尺寸小1-2 mm。 8)拆下底座,并切成两条条状的瓦楞纸板,以匹配流道的底座。将它们粘到跑步者身上。然后在卡上放2个孔,以匹配螺丝孔。重新安装底座。调整螺钉压力,直到盖子完全适合LCD顶部(啊!1-2毫米的间隙!) 9)钻五个按钮孔: 小心地在按钮顶部涂上白色尖顶。 测量左下按钮的位置。在盖子上钻一个导向孔。检查孔是否对准-盖上盖子,从上方照亮火炬-白色按钮顶部应显示。 如有需要,用圆形针头锉调整导向孔-重新检查位置并钻出孔到10mm尼龙垫片的间隙直径。 重复4个以上的按钮。 10)在LCD板上添加“扩展件”按钮: 保护工作表面。 准备一些纸布。移开所有分散注意力的孩子。 检查10毫米尼龙垫片是否紧贴在按钮上。如有必要,扩大孔,直到实现紧密的过盈配合。您将需要无线电控制模型供应商的无线电控制模型制造商氰基丙烯酸酯胶(中等至稀薄的粘度)和一些精细的胶嘴。垂直安装第一个垫片。然后使用最细的喷嘴在管底部内侧涂一点胶。倒置LCD板以防止渗入交换机。等待一分钟,然后按照相同的步骤操作其他按钮。将液晶显示屏倒置30分钟以使胶水固化。在此期间,卸下并丢弃细喷嘴。 检查盒子的盖子是否合适! 11)钻孔并安装充电器插座,开关保险丝和Arial导线(如果需要) 12)从5.5mm直流电源插头上卸下塑料应力消除盒上的螺钉。将一对导线焊接到端子的红色-尖端。 在加热前使用收缩管对电线进行绝缘和弯曲处理。 13 按照包装盒的内部视图所示连接电线。 唱头插座尖端应连接到电池正极。 唱头插座上的开关连接为电路的其余部分提供了电源。 14)在USB插头并重新组装Arduino。 如果需要,将UFL连接包括到导线上-小心轻放。 轻轻拧紧最终的板上安装螺钉。 仔细检查接线。我不接受对此内容或本文中包含的任何其他功能承担责任! 15)连接电池并使用维可牢尼龙搭扣(strongcrock) 将4个小的橡胶脚固定在盒子的底部,即可完成。 步骤4:库和软件 您将需要安装两个库: 1)下载并安装adafruit gps库https://github.com/adafruit/Adafruit-GPS-Library 2)安装adafruit sd卡库: 除非从Arduino libraries文件夹中删除了任何现有的sd库,否则默认安装将无法进行。一定要这样做,然后从https://github.com/adafruit/SD 安装该库,或者保留现有的sd库并下载 SDADA.zip 已修改为接受对SDADA的呼叫。将其安装在 Arduino libraries SDADA 中,这样您仍然可以使用其他SD库 如果您使用的是SDADA版本,则该文件将包含在gps2.ino草图中。该行: #include SDADA.h 如果没有,请注释掉该行并使用:#include SD.h 这两个库都提供了示例可以使用GPS进行测试。 。 默认情况下,以下库应已安装: LiquidCrystal.h SoftwareSerial。 h SPI.h avr/sleep.h 。 下载gps2.zip 将gps2.ino和gps_card.ino保存到Arduino素描目录中自己的文件夹中。 打开gps2.ino Alter以下行: #include SDADA.h 到#include SD.h(如果您不使用我修改的SD库) 此更改也适用于gps_card.ino 检查LCD的设置: 在配置部分: boolean sain = true;//如果使用sainsmart LCD屏蔽,则设置为true;对于其他屏蔽,例如DFROBOT屏蔽,则设置为false。 根据您选择的LCD设置sain变量。 请注意,上述两个LCD板均使用引脚10设置背光。向上按钮可关闭背光,从而节省电池电量。 。 gps2.ino现在应该运行! 。 按钮: a)选择更改LCD第一行上显示的功能: 位置和海拔高度(十进制经度和纬度,随高度交替变化) 位置(十进制经度和纬度) 军械测量东,北向位置坐标加上操作系统工作表编号 海拔高度 距原点的运行距离 距原点的距离 时间 b)左切换公制/英制。 c)右切换日志记录: L显示在登录时右下角 An!此位置的标记表示没有sd卡,或者卡不可用 d)向上切换回显示。 (有用的节能器。) e)向下将距离重置为零: 这会将当前位置设置为范围的原点。 (乌鸦飞到原点的距离。) 。 要激活按钮,请按住它直到LED停止闪烁。然后释放。 步骤5:在Gps2.ino中使用SD卡 设置sd卡: 需要将默认芯片选择引脚和实际chipSelect引脚设置为输出。 SD卡可以通过一个begin语句访问该语句,该语句包括gps板上卡所使用的引脚。 卡速度设置为SPI_Full_SPEED。 如果发生错误,指示灯会闪烁。 如果在配置中将debug设置为true,则还会发送串行监视器消息。 如果卡初始化正常,则变量hascard为设置为true。 。 //确保即使不使用默认芯片选择引脚也设置为 //输出: pinMode(SS,OUTPUT);//默认的mega select引脚 pinMode(chipSelect,OUTPUT); digitalWrite(chipSelect,LOW); //查看卡是否存在以及可以初始化: if(!SD.begin(chipSelect,11,12,13)){ if(debug)Serial.println(F(“ Card init。failed !“)) error(1); } else { if(!card.init(SPI_FULL_SPEED,chipSelect,11,12,13 )){ error(2); if(debug){ Serial.println(F(“初始化失败。检查事项:”) ); Serial.println(F(“ *是否插入卡?”)); Serial.println(F(“ *您的接线正确吗?”)) ; Serial.println(F(“ *您是否更改了chipSelect引脚以匹配您的屏蔽或模块?”)); } }其他{ hascard = true; if(debug)Serial.println(F(“ Card init。成功”)); } } 选择要记录的SD文件: 按下右手按钮会调用子例程openfile 这将检查gps文件夹以查找未使用的文件名 如果找到文件,则将foundit设置为true。 如果(!hascard){return;}//,则从GPSLOGnn.TXT开始,其中nn = 0到99。如果卡不存在或不可用,则不要继续 字节i; 字符文件名[18]; strcpy(filename,“/gps/GPSLOG00.TXT“); 文件名[17] = char(0); 布尔值foundit = false; 为(i = 0;我《100; i ++){ 文件名[11] =‘0’+ i/10; 文件名[12] =‘0’+ i%10; if(!SD.exists(filename)){ foundit = true; break; } } 如果所有文件名都在使用中,则Foundit为false,并且询问用户是否应删除前50个。如果不能接受,则将hascard设置为false,以便不再尝试登录。 if(!foundit){ int thisbutton = -1; lcd.clear(); lcd.print(“ Dir full-Erase?”); lcd.setCursor(0,1); lcd.print(“Sel:Ok Right:No“); 执行{ 此按钮= read_LCD_buttons(); } while(thisbutton == btnNONE); lcd.clear(); if(thisbutton == btnSELECT){ lcd.print(“正在删除” ); for(i = 0; i 《50; i ++){ 文件名[11] =‘0’+ i/10; 文件名[12] =‘0’+ i%10; 如果(SD.exists(文件名))SD.remove(文件名); } i = 0; 文件名[11] =‘0’+ i/10; 文件名[12] =‘0’+ i%10; }其他{ error(4); hascard = false; return; } } 可以打开文件: 发生错误时,将输出串行信息,并通过状态指示灯指示错误代码。 如果成功,则输出文件的第一行。这是列标题。 请注意使用logfile.flush()。 logfile = SD.open(filename,FILE_WRITE); if(!logfile){ if(调试){ Serial.print(“无法创建”); Serial.println(文件名); } error(3); hascard = false; }其他{ logging = true; myfile =文件名; logfile.println(pad(”Time“,13)+ lpad(” Date“,9)+ lpad(” Longitude“,10) + lpad(” Latitude“,10)+ lpad (“ Altitude”,9)+“ m” + lpad(“ Geoid”,9)+“ m” + lpad(“ Speed”,7)+“ mph mph”); logfile.flush (); if(debug){Serial.print(“ Writing to”); Serial.println(filename);} } 。 lpad 和 pad 是文本填充功能: 。 字符串lpad(字符串temp,字节L){ byte mylen = temp.length(); if(mylen》(L-1))return temp.substring(0,L-1); for(字节i = 0; i 《(L-mylen); i ++)temp =“” + temp; 返回温度; } String pad(String temp,byte L){ byt e mylen = temp.length(); if(mylen》(L-1))return temp.substring(0,L-1); for(字节i = 0; i 《(L-mylen); i ++)temp = temp +“”; 返回温度; } 。 写入文件: 如果正在记录日志,主循环将读取gps并将其值输出到文件。 (“ L”显示在LCD屏幕的右下方。) 。 将值格式化为固定宽度的列。 。 函数dtostrf(float,w,dp,buf)是一个Arduino库函数,它接受一个float变量并将其转换为宽度为w且带dp小数点的字符串。 buf是一个char缓冲区,必须足够大才能处理转换。 我用“ char buf [20];”定义了buf。 在继续之前先清空文件。 。 ogfile.print(pad(mytime,13));//包括毫秒数 logfile.print(pad(myyear,9)); logfile.print(dtostrf(longitude,10,5,buf)); logfile.print(dtostrf(latitude,10,5,buf)); logfile.print(dtostrf(altitudem,9,1,buf)); logfile.print(“ m”); logfile.print(dtostrf(大地水准面,9,1,BUF)); logfile.print(“ m”); logfile.print(dtostrf(speedmph,7,2,buf)); logfile.print(“ mph”); logfile.print(dtostrf(heading,6,1,buf)); logfile.println(“ deg”); logfile.flush(); 。 关闭文件: 如果该卡不可用,请返回,否则在关闭文件之前将所有剩余的输出刷新到卡上。 void closefile(){ if(!hascard) return; logfile.flush(); logfile.close(); logging = false; if(debug) Serial.println(“ File” + myfile +“ closed”); } 步骤6:读取Gps 在脚本头中设置库: #include Adafruit_GPS.h #include SoftwareSerial。 h HardwareSerial mySerial = Serial1; Adafruit_GPS GPS(&mySerial); 在启动时选择gps: pinMode (chipSelect,OUTPUT); digitalWrite(chipSelect,LOW); GPS.begin(9600); //设置更新速率//1Hz正常工作并留出时间来执行记录GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);//或者0.1Hz,5Hz和10Hz更新频率 //RMC(建议最小值):GGA(固定数据),包括海拔GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); //如果固件允许,则关闭天线状态更新 GPS.sendCommand(PGCMD_NOANTENNA); 。 通过中断读取GPS 请注意,实际上是在Adafruit_GPS.h库代码中而不是在此中断例程中解释数据。 //如果GPSECHO = true,则在Timer0上中断1毫秒以促进gps数据回波- useInterrupt(true);//如果为true,则通过中断读取输入。 。 就是这样!循环读取: GPS.newNMEAreceived()如果到达了新的GPS信息,则设置为true。 GPS.parse(stringptr),如果设置为true,则设置为true已成功从原始GPS文本字符串中分离(解析)。 如果GPS报告其位置有固定值,则GPS.fix设置为true。 如果gps具有修复程序提取位置,高度,速度,方位角,时间,大地水准面高度,卫星和hdop的值。 以十进制经度和纬度返回位置,以节为单位返回速度,以米为单位返回距离。 。 if(GPS.newNMEAreceived()){ char * stringptr = GPS.lastNMEA(); 。 if( !GPS.parse(stringptr))返回;//如果为假 。 if(GPS.fix){ digitalWrite(ledGreen,HIGH); fixed = true;//记住状态,以防它在过程中发生变化 mymillis = GPS.milliseconds; myseconds = GPS.seconds; mytime = String(GPS.hour )+“:” + String(GPS.minute)+“:”; logtime = mytime; logtime + = String(int(myseconds + mymillis/1000 + 0.1) );//如果在0.1 S之内取整 mytime + = String(myseconds + mymillis/1000);//完整的召回时间 myyear = String(GPS.day)+“/” + String(GPS.month)+“/”; lcdyear = myyear; theyear = String(GPS.year); myyear + = theyear; mylen = theyear.length(); lcdyear + = theyear.substring( mylen-1,mylen);//仅适合以下位数的数字 纬度= GPS.latitudeDegrees; 经度= GPS.longitudeDegrees; altitudem = GPS.altitude; altitudef = Heightm * fconvert; 速度结= GPS.speed; speedmph =速度结* 1.15077945; speedkph =速度结* 1.85200; heading = GPS.angle; satellites = GPS.satellites; geoid = GPS.geoidheight; hdop = 7-int (GPS.HDOP + 0.5); 步骤7:英国国家网格位置和行进距离 1)将十进制经度和纬度的位置转换为英国军械测量仪单位的详细信息,请参见军械测量提供的pdf文件: http://www.ordnancesurvey.co.uk/docs/support/guide 。。. 第40页不会使人眼花,乱,但确实提供了必要的数学。 我的子程序空弹药(float phi,float lamda)实现了计算。 对于Easti,返回的值精确到+-0.1 ng和+-0.02(向北)。精度不足的原因是Arduino浮点运算的精度有限。 Arduino仅支持“ 6-7”个有效小数位。 。 可以从经度和纬度值的最高有效位中提取兵器测量图纸编号。函数字符串NE2NGR(float&east,float&north)执行提取,并归功于: Alex http://www.codeproject.com/Articles/13577/GPS-Der 。。. 。 2)可以通过两个纬度和经度值的差来计算出行进距离。 对于小的差异,估计值必须是可疑的由于GPS定位固有的精度不足。 Arduino浮点小数位支持的限制也影响整体精度。尽管如此,累积的行进距离估计还是合理的。到原点的范围非常准确,因为它仅涉及两个位置之间的差异。 可以使用下部按钮重新设置距离计算的原点。 在低速时我在三秒钟的时间内对位置进行了采样,以增加位置差异大于GPS定位中不确定性距离的可能性。以较高的速度,我减少了采样位置之间的时间。此时间由变量dlimit控制。 子例程float distance_between(float lat1,float long1,float lat2,float long2)之间返回该距离。 原始工作被归功于Maarten Lamers。 步骤8:使用Gps_card.ino 此草图假定您已连接串行监视器,最好是具有复制文本功能的串行监视器。 不幸的是,默认的Arduino串行监视器似乎不提供此功能。 (我写了我自己的文章。) Roger Meier的CoolTerm完成了http://freeware.the-meiers.org/ 。 如果使用默认的SD库设置,请进行以下更改: #include SD.h代替#include SDADA.h 。 设置将串行监视器设置为115200。 。 运行草图时,它将测试SD卡并显示卡的大小和gps目录的详细信息。/strong》 键入文件名,它将打开并显示。 可以使用 #delete删除单个文件文件名 数据以固定宽度的列显示,并带有空格分隔符。 假设您可以复制文本,使用excel中的值非常简单。 第9步:规格 LCD显示屏有一个可选的顶行和一个下部行,由: 卫星数 速度 HDOP-水平位置稀释 轴承 记录状态: “ L”-记录 “”-未记录 “!” -SD卡不存在或不可用 顶行: 经度和纬度位置,以度为单位 经度(以度为单位) 英国国家地理参考 海拔 从原点出发的距离(可以重置原点) 原点距 时间 注意: 公制或英制的LCD值。 对于LCD显示屏,速度《=截止(0.65)mph的速度显示为0 卫星数目在左下角显示为竖线。该栏已满后,可以显示的最大数字为8。 HDOP显示在下部中央移动栏中。 HDOP表示观察到的卫星的扩展-扩展的扩展提高了准确性,HDOP数量减少了。 HDOP值1很好! HDOP精度《0.5用实线表示。 HDOP值为0.5到1.5(1)用7条表示。 HDOP为6时显示为1条。 HDOP》 6时没有显示条。 按钮: a)选择更改液晶屏第一行 高度/位置(经度和纬度) 位置(经度和纬度) 位置在军械测量中,x,y坐标 高度 时间 b)左切换公制/英制 c)右切换日志记录 d)向上切换回显示(有用的节电器) e)向下将距离重置为零,并将当前位置设置为范围的原点(乌鸦将距离原点飞出) ) 要激活按钮,请按住直到LED停止闪烁。然后释放。 LED指示灯: 1秒间隔闪烁红色-不修复 1秒间隔闪烁绿色-修复 四个短绿色闪烁-已按下按钮 1个红色闪烁重复了5次-错误1:SD卡初始化失败 2个红色闪烁重复了5次-错误2:SD卡全速初始化失败 3次红色闪烁重复5次-错误3:无法创建日志文件 4次红色闪烁重复5次-错误4:日志文件夹中有100个文件,并且不会删除 累积距离估算值将在多个一秒钟的间隔位置产生累积舍入误差。 请注意,“军械”测量值的精度是有限的-arduino浮点值保留6-7个有效的小数位。转换公式涉及许多计算,并且舍入误差具有累积影响。最终,精度受返回的sin,cos和tan值的限制。 东移值似乎精确到+-0.1 北移到+-0.02 通过比较,经度/纬度值似乎精确到+-0.00001 将ufl连接到SMA引线不会影响性能。 GPS芯片只能识别活动的ariar(1575.42MHz)。 收藏(0)