把一个椭圆形的教练和pygame的

你好,朋友!它发生这样从伤病中恢复过来,我给自己买这样的设备。



有了自己的职责,他应付得不错,但有一个“但是”,它由一个事实,即车速表被混淆的证词,因此在显示行驶距离不同的结果。如果你足够慢,车速表在所有沉默。并决定让你的速度表与......嗯,你懂的。


如何连接计算机仿真和 H4>
首先,它被决定开始 - 找到一种方式来获得在计算机上的数据。中介,它决定使用该卡的的Arduino B>。
为什么的Arduino B>?因为你没有或其他任何适当的。
经检查后发现,从模拟器到传感器具有两个输出。


这将足以将其连接到销的 Arduino的的。这是在这里做的就是这样一个计划


上接触的 A 0 的,这取决于踏板的位置,该信号会各种尺寸。
在实验中已经尝试了多种选择报警从微控制器到电脑,并最终定居在这个版本:
一台电脑连续铸字«0»的,那么,当在模拟器中的一个步骤,服«1» B>的。下一步 - 再«0» B>等圆
以下是小品 B> <前>&LT;代码级=&QUOT; CPP&QUOT;&GT; INT引脚= A0; INT ledPin = 13; INT minSignal = 600;布尔stateUp = FALSE;布尔lastState = FALSE;布尔一步法= FALSE;无效设置(){pinMode(针,INPUT); pinMode(ledPin,OUTPUT); Serial.begin(9600); }虚空环(){INT信号= analogRead(针);如果(信号&GT; minSignal){stateUp = TRUE; }其他{stateUp = FALSE; }如果(lastState = StateUp和放大器;!&安培; lastState ==假){一步法=不一步法; }否则{} lastState = stateUp; Serial.println(一步法); digitalWrite(ledPin,一步法); // LED}&LT; /码&GT; PRE>
  

游戏 H4>
还有什么的 pygame的如果你不玩? I>

创意 H5>
椭圆教练机是模拟走路的滑雪板,所以这将是一场比赛的滑雪者。在模拟器上采取的每一个步骤,使角色在游戏中。首先要做出一个平稳的运动\加速的性格,但最终决定优先考虑的准确性。

结算 H5>
凭经验,已经发现,在“最佳”的情况下,一整圈等于第四米。这可能不是什么人经过,多少滚动盘中央。刚刚接受这个值作为一个公理。
上的虚拟磁道1米等于1个像素。即此举persnazha的每一步4个像素领先。
速度计算的一举一动。
V B> = 取值 B> / T B>
取值 B> = 4米
T B> - 时间一步。
*一步 - 一个完整的转动踏板 I>

激情 H5>
是的,有图形和一个带定时器的速度计,但我想竞争的精神。
但是,如果你不与别人和自己的昨天抗衡,吗?说 - 完成。


顶尖人物的今天,底部 - 昨天。为了更准确 - 的最后一场比赛的字符,但你必须承认,第一个选项听起来凉

技术细节 H4>

数据库 H5>
当然,只需要保持信息上的比赛,你需要一个数据库。我决定使用的MySQL B>。在蟒蛇的使用图书馆的 MySQLdb的 B>。该应用程序负责类 B>的相互作用的 DataManger。
该方案被应用。


代码示例 B> <前>&LT;代码级=&QUOT;蟒蛇&QUOT;&GT; slass的DataManager的:def __init __(个体经营):self.time =时间self.currentTimeForLastRace = datetime.now()self.currentTime = self.time.time()self.speed = 0 self.db = MySQLdb.connect(主机=&QUOT;本地主机&QUOT;用户=&QUOT;根&QUOT;,passwd文件=&QUOT;根&QUOT;,DB =&QUOT; skirunner&QUOT;,字符集= 'UTF8')self.cursor = self.db.cursor()self.isGetLastRaceSpeed​​s =假self.dataLastRace = [] self.lastRaceMinDate = datetime.now()self.value = 0 self.lastValue = 0 self.impulse = 0 self.isRaceStart =假self.currentRaceId = -1 self.currentDistanceId = -1 self.currentProfileId = -1高清getImpulse(个体经营,价值):self.impulse = 0,如果self.time.time() - self.currentTime&GT; RESET_SPEED_TIME:self.speed = 0 self.value =值,如果self.value = Self.lastValue:时间= self.time.time() - self.currentTime self.impulse = POWER_IMPULSE self.isRaceStart =真self.speed = STEP /时间#每秒self.currentTime米= self.time.time()self.lastValue = self.value返回self.impulse高清getLastRaceDistanceAtCurrentTime(个体经营,raceId,currentTime的):lastRaceDistance = 0 DATEFORMAT =&QUOT;%Y-%M - %D%H:%M:%S.%F&QUOT;如果不是self.isGetLastRaceSpeed​​s:SQL =&QUOT;&QUOT;&QUOT; SELECT分钟(日期)FROM runLog WHERE race_id =%S&QUOT;&QUOT;&QUOT; %RaceId self.cursor.execute(SQL)数据= self.cursor.fetchall()进行录制的数据:self.lastRaceMinDate = datetime.strptime(REC [0],日期格式)的sql =&QUOT;&QUOT;&QUOT; SELECT的距离,日期FROM runLog WHERE race_id =%s的ORDER BY日期DESC&QUOT;&QUOT;&QUOT; %RaceId self.cursor.execute(SQL)self.dataLastRace = self.cursor.fetchall()self.isGetLastRaceSpeed​​s = true如果self.isRaceStart:时间= datetime.now() - datetime.fromtimestamp(currentTime的)的REC自我。 dataLastRace:距离,日期= REC如果时间&LT; =(datetime.strptime(日期,日期格式) - self.lastRaceMinDate):lastRaceDistance =距离回归lastRaceDistance&LT; /码&GT; PRE>
  

图形 H5>
你可以从上面的截图看到,图元,但不nyashnost是最主要的。它的实施,已用于图书馆的 pygame的 B>。的工作,我已经 写道。

表格 H5>


用于图书馆的 PyQt的的形式。
代码示例 B> <前>&LT;代码级=&QUOT;蟒蛇&QUOT;&GT;类FormProfile(QMainWindow中):DEF __init __(个体经营):超(QMainWindow的,个体经营).__的init __()uic.loadUi(' %S / UI / frm_profile.ui“%DIR,个体经营)self.cb_profile_load()self.te_newProfile.hide()self.bt_addProfile.hide()self.bt_cancel.hide()self.lb_add.hide()self.move (。QDesktopWidget()availableGeometry()中心() - self.frameGeometry()中心())self.connect(self.bt_ok,SIGNAL(&QUOT;点击()&QUOT;),self.bt_ok_clicked)self.connect( self.bt_new,SIGNAL(&QUOT;点击()&QUOT;),self.bt_new_clicked)self.connect(self.bt_addProfile,SIGNAL(&QUOT;点击()&QUOT;),self.bt_addProfile_clicked)self.connect(self.bt_cancel, SIGNAL(&QUOT;点击()&QUOT;),self.bt_cancel_clicked)self.connect(self.bt_graph,SIGNAL(&QUOT;点击()&QUOT;),self.bt_graph_clicked)高清bt_ok_clicked(个体经营):self.profileId =自我。 。cb_profile.itemData(self.cb_profile.currentIndex())的toString()self.formDistance = FormDistance(self.profileId)self.formDistance.show()self.hide()&LT; /码&GT; PRE>
  
我真的很喜欢在发展过程中的窗口。没有比在 MS工作室更加困难 B>。
的Qt 4的创造者的创建形式。
将它们导入到代码的
&LT;代码级=&QUOT;蟒蛇&QUOT;&GT; uic.loadUi(“%S / UI / frm_profile.ui”%DIR,个体经营)&LT; /码&GT;  PRE> 
相关事件和<前>&LT方法;代码级=&QUOT;蟒蛇&QUOT;&GT; self.connect(self.bt_ok,SIGNAL(&QUOT;点击()&QUOT;),self.bt_ok_clicked)self.connect(self.bt_new,SIGNAL(&QUOT;点击()&QUOT;),self.bt_new_clicked)self.connect( self.bt_addProfile,SIGNAL(&QUOT;点击()&QUOT;),self.bt_addProfile_clicked)self.connect(self.bt_cancel,SIGNAL(&QUOT;点击()&QUOT;),self.bt_cancel_clicked)self.connect(self.bt_graph, SIGNAL(&QUOT;点击()&QUOT;),self.bt_graph_clicked)&LT; /码&GT; PRE>
并显示
<前>&LT;代码级=&QUOT;蟒蛇&QUOT;&GT; self.formProfile = FormProfile()self.formProfile.show()&LT; /码&GT; PRE>

图 H5>


图表库使用matplotlib。
在这里,示例代码 B> <前>&LT;代码级=&QUOT;蟒蛇&QUOT;&GT;进口matplotlib.pyplot为PLT高清bt_averageSpeed​​_clicked(个体经营):... plt.plot_date(日期,价值观,“B ')plt.plot_date(日期,价值观,'博')averageSpeed​​ = len个(值)&GT; 0和(拉姆达:总和(值)/ LEN(值))或(拉姆达:0)plt.xlabel(U&QUOT;高平均速度=%.2f米/秒或%.2f公里/小时&QUOT;%(浮动( averageSpeed​​()),浮点(averageSpeed​​())/ 1000 * 3600))plt.ylabel(U&QUOT;平均车速(米/秒)&QUOT;)plt.title(U&QUOT;速度曲线%S&QUOT;%dm.getProfileNameById( self.profileId))plt.gca()。xaxis.set_major_formatter(mdates.DateFormatter(“%D /%M /%Y'))plt.gcf()。autofmt_xdate()plt.grid(真)plt.show( )&LT; /码&GT; PRE>
我想指出,以显示西里尔字体支持需要连接。
<前>&LT;代码级=&QUOT;蟒蛇&QUOT;&GT;从matplotlib进口RC字体= {'家庭':'德罗伊德桑“,”重量“:”正常“,”大小“:14} RC(”字体“, **字体)和LT; /码&GT; PRE>
  

从Arduino的读取数据 H5>
为了这个目的,使用该库的串行 B>。
下面的代码在一个单独的线程中运行。
<前>&LT;代码级=&QUOT;蟒蛇&QUOT;&GT;高清getDataFromSimulator():全球valueFromSimulator,isRunnig SER = serial.Serial('的/ dev / ttyACM0“,9600),而isRunnig:值= ser.readline()试试: valueFromSimulator = INT(值),除了:通&LT; /码&GT; PRE>
可变的 valueFromSimulator 的其他线程仅用于阅读。
此次推出的两个流。
<前>&LT;代码级=&QUOT;蟒蛇&QUOT;&GT; T1 = threading.Thread(目标=主,的args =(self.profileId,self.distanceId))T2 = threading.Thread(目标= getDataFromSimulator)t2.start( )t1.start()&LT; /码&GT; PRE>

质量差视频演示 H4>
由于订购。


我会很高兴的意见,批评和建议。 I>
这里所有的源代码

来源: habrahabr.ru/post/217891/

标签

另请参见

新&值得注意