基于wifi的小车重力控制代码
- 格式:doc
- 大小:73.50 KB
- 文档页数:11
多功能电动智能小车学院:电子科学与工程学院一引言1.作品设计的目的:本次设计智能小车的目的是为了实践电路设计的方法和技巧,将书本中的理论知识运用到实践中去,做到活学活用,深入了解电子元器件及其他元器件的基本用途和使用方法,并且能够灵活快速的判断电路中出现的故障,学会独立设计电路,积累更多的设计经验,加强并掌握焊接的能力和技巧,完成预期的要求。
2.作品设计的意义:智能小车实质上是众所周知的简易机器人雏形。
机器人设计是一个极富挑战性的高技术密集型项目,融小车机械、机器人学、机电一体化、单片机、数据融合、精密仪器、实时数字信号处理、图象处理与图象识别、知识工程与专家系统、决策、轨迹规划、自组织与自学习理论、多智能体协调、以及无线通讯等理论和技术于一体,既是典型的智能机器人系统,又为研究发展多智能体系统、多机器人之间的合作与对抗提供了生动的研究模型。
机器人设计通过提供标准任务,使研究人员利用各种技术来获得最佳解决方案。
机器人设计所采用的理论与技术可应用于工业生产、自动化流水线、救援、教育等领域,从而有效推动国家科学技术等其他高、精、尖领域的发展本小组本次研制的多功能智能小车具有寻迹、避障、消防和转向指示功能,可用与探测火源以及到某些人类不便接近的地点执行特殊任务,同时也是在机器人研究领域做一次大胆尝试。
3简易智能小车的原理:以单片机为电路的中央处理器来处理传感器采集到的数据,处理完毕后通过电机驱动电路来驱动电机。
电源部分为整个电路模块提供动力。
整体电路共分为七个部分:MCU控制电路、电机驱动电路、电源供电电路、寻迹检测电路、避障检测电路、LED显示部分,探测火源与灭火部分。
二总体方案设计(1)电动车车体的选择方案一:自制小车。
可在车模店选购配件组装,或者自行加工。
优点:这种方法能够制作出完全符合自身设计意图的车体。
缺点:需要较多时间和高水平的加工工艺。
方案二:配置成品的玩具电动小汽车。
优点:较方便。
缺点:不完全符合使用要求,需要做大量修改。
⽤ESP8266+android,制作⾃⼰的WIFI⼩车(Android软件)先说⼀下这篇⽂章⾥⾯的内容:TCP 客户端, ⾃定义对话框, ⾃定义按钮, ProgressBar竖直显⽰, 重⼒感应传感器,⼿机返回键新开启界⾯的问题(返回上次的界⾯),数据保存软件的通信是配合软件的第⼀个界⾯就⼀个按钮点击按钮弹出⼀个⾃定义的对话框连接的时候连接上其实⼀开始想多加⼀些功能,,不过后来想了想复杂了反⽽不利于学习.........我会从⼀开始做到结束都写清楚,如果有⼤神看到哪地⽅不合理请指教哈,,,,,好现在开始做APP⼀路Next就⾏...您会发现⾃⼰的按钮是圆边的其实是⾃⼰⾃定义了⼀些参数新建⼀个⽂件夹存储咱们⾃定义的⼀些东西对了为什么名字是drawable其实是官⽅提供的,,然后呢各个参数后⾯都有具体解释有些⼩伙伴⼀看....英⽂的............⼤哥下⼀个有道翻译或者别的翻译软件翻译⼀下...................可以⾃⼰搜索⾃⼰想要的好像这些外形啦背景什么的都在授⼈予鱼,也要授⼈予渔;⾸先定义⼀下外形⽅形然后呢描⼀下边框,,,显得是⼀个按钮其实可以官⽅解释然后定义⼀下按钮现在显⽰的颜⾊好现在让它的四个⾓变成圆⾓,,,对于我这个学机械的⽽⾔在solidworks⾥⾯应该叫做倒⾓,,,,有没有学机械的看到这篇⽂章哈...记得曾经遇到⼀个⼈和我正好相反,,我是报的机械专业,⾃学的电⽓,,,,,,⽽另⼀个⼈是报的电⽓却喜欢机械........兴趣.........好啦拖⼀个按钮过来,放到中⼼.....您也可以在布局⽂件⾥⾯⾃⼰写哈......我是怎样⽅便怎样弄,,我⽤的是相对布局保存⼀下现在看效果好现在再定义⼀个按钮按下时的外表⽂件private OnTouchListener buttonconnect1Touch = new OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stubif (event.getAction()==MotionEvent.ACTION_DOWN) {buttonconnect1.setBackgroundResource(R.drawable.buttondown);}if (event.getAction()==MotionEvent.ACTION_UP) {buttonconnect1.setBackgroundResource(R.drawable.butonup);}return false;}};package com.wificardemo;import android.app.Activity;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.MotionEvent;import android.view.View;import android.view.View.OnTouchListener;import android.widget.Button;public class MainActivity extends Activity {Button buttonconnect1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);buttonconnect1 = (Button) findViewById(R.id.button11);//获取按钮buttonconnect1.setOnTouchListener(buttonconnect1Touch);//按钮的触摸事件}private OnTouchListener buttonconnect1Touch = new OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stubif (event.getAction()==MotionEvent.ACTION_DOWN) {buttonconnect1.setBackgroundResource(R.drawable.buttondown);}if (event.getAction()==MotionEvent.ACTION_UP) {buttonconnect1.setBackgroundResource(R.drawable.butonup);}return false;}};@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button, so long// as you specify a parent activity in AndroidManifest.xml.int id = item.getItemId();if (id == R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);}}现在编译⼀下运⾏到⼿机看⼀下我是直接⽤的⾃⼰的⼿机,,没有仿真,,现在我的电脑⽤仿真可是不得了......平时的状态按下后⾃⼰看着改改⼤⼩和显⽰咱们现在要做的是其实这个是⾃⼰⾃定义的⼀个界⾯对了设置⼀下主题风格...感觉这种风格挺好的图⽚可以在我源码⾥⾯找,也可以⾃⼰弄⾃⼰的对了,,,,位置还有名字什么的⾃⼰看着修改哈整体界⾯呢,,,<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="/apk/res/android" android:layout_width="match_parent"android:layout_height="match_parent" ><TextViewandroid:background="@android:color/white"android:id="@+id/textView22"android:layout_width="wrap_content"android:layout_height="2dip"android:layout_alignParentLeft="true"android:layout_alignParentRight="true"android:layout_below="@+id/imageView21"android:layout_marginTop="15dp" /><TextViewandroid:id="@+id/textView21"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="8dp"android:layout_marginLeft="19dp"android:layout_toRightOf="@+id/imageView21"android:text="连接"android:textAppearance="?android:attr/textAppearanceLarge"android:textColor="@android:color/white" /><TextViewandroid:id="@+id/textView23"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentLeft="true"android:layout_below="@+id/textView22"android:layout_marginTop="23dp"android:text="IP地址:" /><EditTextandroid:id="@+id/editText21"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignBaseline="@+id/textView23"android:layout_alignBottom="@+id/textView23"android:layout_alignLeft="@+id/textView21"android:ems="10"android:text="192.168.4.1" /><ImageViewandroid:id="@+id/imageView21"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="10dp"android:layout_marginTop="14dp"android:src="@drawable/image1" /><TextViewandroid:id="@+id/textView24"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignBaseline="@+id/editText22"android:layout_alignBottom="@+id/editText22"android:layout_alignParentLeft="true"android:text="端⼝号:" /><EditTextandroid:id="@+id/editText22"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignLeft="@+id/editText21"android:layout_below="@+id/editText21"android:layout_marginTop="10dp"android:ems="10"android:text="8080" /><Buttonandroid:id="@+id/button21"android:layout_width="80dp"android:layout_height="40dp"android:layout_alignParentRight="true"android:layout_below="@+id/editText22"android:layout_marginRight="10dp"android:background="@drawable/butonup"android:text="连接" /><Buttonandroid:id="@+id/Button22"android:layout_width="80dp"android:layout_height="40dp"android:layout_alignBottom="@+id/button21"android:layout_alignTop="@+id/button21"android:layout_marginLeft="10dp"android:background="@drawable/butonup"android:text="取消" /><ProgressBarandroid:id="@+id/progressBar21"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignTop="@+id/textView23"android:layout_centerHorizontal="true" /></RelativeLayout>好了现在点击主界⾯的按钮把这个界⾯当做提⽰框显⽰出来package com.wificardemo;import android.app.Activity;import android.app.AlertDialog;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.MotionEvent;import android.view.View;import android.view.View.OnTouchListener;import android.widget.Button;import android.widget.EditText;import android.widget.ProgressBar;import android.widget.TextView;public class MainActivity extends Activity {Button buttonconnect1;AlertDialog AlertDialog21;//定义⼀个提⽰框View View1;//定义⼀个view⽤来获取咱们⾃定义的界⾯Button connectbutton21;//连接服务器Button cancelbutton22;//取消按钮ProgressBar progressBar21;//进度条EditText iPEditText;//IP地址EditText portEditText;//端⼝号TextView titleEditText;//"连接"@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setTheme(android.R.style.Theme);//设置主题风格setContentView(yout.activity_main);buttonconnect1 = (Button) findViewById(R.id.button11);//获取按钮buttonconnect1.setOnTouchListener(buttonconnect1Touch);//按钮的触摸事件/**对话框相关**/AlertDialog21 = new AlertDialog.Builder (MainActivity.this).create();View1 = View.inflate(MainActivity.this, yout.dialog, null);AlertDialog21.setView(View1);//设置显⽰内容为⾃定义的界⾯connectbutton21 = (Button) View1.findViewById(R.id.button21);//连接服务器按钮 cancelbutton22 = (Button) View1.findViewById(R.id.Button22);//取消按钮progressBar21 = (ProgressBar) View1.findViewById(R.id.progressBar21);//进度条 progressBar21.setVisibility(-1);//进度条不显⽰iPEditText = (EditText)View1.findViewById(R.id.editText21);//IP地址portEditText = (EditText)View1.findViewById(R.id.editText22);//端⼝号titleEditText = (TextView) View1.findViewById(R.id.textView21);//"连接"}/**** 主界⾯连接服务器按钮*/private OnTouchListener buttonconnect1Touch = new OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stubif (event.getAction()==MotionEvent.ACTION_DOWN) {buttonconnect1.setBackgroundResource(R.drawable.buttondown);}if (event.getAction()==MotionEvent.ACTION_UP) {buttonconnect1.setBackgroundResource(R.drawable.butonup);}return false;}};}现在呢就缺少显⽰了...我们在主按钮的点击事件中调⽤显⽰函数package com.wificardemo;import android.app.Activity;import android.app.AlertDialog;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.MotionEvent;import android.view.View;import android.view.View.OnClickListener;import android.view.View.OnTouchListener;import android.widget.Button;import android.widget.EditText;import android.widget.ProgressBar;import android.widget.TextView;public class MainActivity extends Activity {Button buttonconnect1;AlertDialog AlertDialog21;//定义⼀个提⽰框View View1;//定义⼀个view⽤来获取咱们⾃定义的界⾯Button connectbutton21;//连接服务器Button cancelbutton22;//取消按钮ProgressBar progressBar21;//进度条EditText iPEditText;//IP地址EditText portEditText;//端⼝号TextView titleEditText;//"连接"@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setTheme(android.R.style.Theme);//设置主题风格setContentView(yout.activity_main);buttonconnect1 = (Button) findViewById(R.id.button11);//获取按钮buttonconnect1.setOnClickListener(buttonconnect1Click);//按钮点击事件buttonconnect1.setOnTouchListener(buttonconnect1Touch);//按钮的触摸事件/**对话框相关**/AlertDialog21 = new AlertDialog.Builder (MainActivity.this).create();View1 = View.inflate(MainActivity.this, yout.dialog, null);AlertDialog21.setView(View1);//设置显⽰内容为⾃定义的界⾯connectbutton21 = (Button) View1.findViewById(R.id.button21);//连接服务器按钮 cancelbutton22 = (Button) View1.findViewById(R.id.Button22);//取消按钮progressBar21 = (ProgressBar) View1.findViewById(R.id.progressBar21);//进度条 progressBar21.setVisibility(-1);//进度条不显⽰iPEditText = (EditText)View1.findViewById(R.id.editText21);//IP地址portEditText = (EditText)View1.findViewById(R.id.editText22);//端⼝号titleEditText = (TextView) View1.findViewById(R.id.textView21);//"连接"}/**** 主按钮点击事件*/private OnClickListener buttonconnect1Click = new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubAlertDialog21.show();}};/**** 主界⾯连接服务器按钮背景改变*/private OnTouchListener buttonconnect1Touch = new OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stubif (event.getAction()==MotionEvent.ACTION_DOWN) {buttonconnect1.setBackgroundResource(R.drawable.buttondown);}if (event.getAction()==MotionEvent.ACTION_UP) {buttonconnect1.setBackgroundResource(R.drawable.butonup);}return false;}};}现在安装到⼿机上看⼀下---界⾯还可以做这个简单的取消事件连接按钮呢!!我先说⼀下思路,,,按下连接按钮是启动⼀个连接任务,然后呢还要启动⼀个倒计时器(3S),,,控制这个连接任务执⾏的时间,还要显⽰进度条,,如果3S内连接上了,,那么在连接的后⾯关掉进度条,结束这个连接任务,取消定时器,关闭对话框,然后进⼊控制界⾯,,如果3S 内没有连接上,也关闭连接任务,关掉进度条,同时显⽰连接失败.现在的package com.wificardemo;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import .InetAddress;import .Socket;import android.app.Activity;import android.app.AlertDialog;import android.os.Bundle;import android.os.CountDownTimer;import android.renderscript.Mesh.Primitive;import android.view.Menu;import android.view.MenuItem;import android.view.MotionEvent;import android.view.View;import android.view.View.OnClickListener;import android.view.View.OnTouchListener;import android.widget.Button;import android.widget.EditText;import android.widget.ProgressBar;import android.widget.TextView;public class MainActivity extends Activity {Button buttonconnect1;AlertDialog AlertDialog21;//定义⼀个提⽰框View View1;//定义⼀个view⽤来获取咱们⾃定义的界⾯Button connectbutton21;//连接服务器Button cancelbutton22;//取消按钮ProgressBar progressBar21;//进度条EditText iPEditText;//IP地址EditText portEditText;//端⼝号TextView titleEditText;//"连接"String Ipstring="";//记录IP地址int portint=0;//记录端⼝号boolean ConnectFlage=true;int ShowPointSum=0;//显⽰点的数量,连接中.....(后⾯的点)Socket socket = null;//定义socketInetAddress ipAddress;OutputStream outputStream=null;//定义输出流InputStream inputStream=null;//定义输⼊流@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setTheme(android.R.style.Theme);//设置主题风格setContentView(yout.activity_main);buttonconnect1 = (Button) findViewById(R.id.button11);//获取按钮buttonconnect1.setOnClickListener(buttonconnect1Click);//按钮点击事件buttonconnect1.setOnTouchListener(buttonconnect1Touch);//按钮的触摸事件/**对话框相关**/AlertDialog21 = new AlertDialog.Builder (MainActivity.this).create();View1 = View.inflate(MainActivity.this, yout.dialog, null);AlertDialog21.setView(View1);//设置显⽰内容为⾃定义的界⾯connectbutton21 = (Button) View1.findViewById(R.id.button21);//连接服务器按钮cancelbutton22 = (Button) View1.findViewById(R.id.Button22);//取消按钮progressBar21 = (ProgressBar) View1.findViewById(R.id.progressBar21);//进度条progressBar21.setVisibility(-1);//进度条不显⽰iPEditText = (EditText)View1.findViewById(R.id.editText21);//IP地址portEditText = (EditText)View1.findViewById(R.id.editText22);//端⼝号titleEditText = (TextView) View1.findViewById(R.id.textView21);//"连接"cancelbutton22.setOnClickListener(cancelbutton22Click);//对话框取消事件connectbutton21.setOnClickListener(connectbutton21Click);//对话框连接按钮点击事件 }/**** 对话框连接按钮点击事件*/private OnClickListener connectbutton21Click = new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubIpstring = iPEditText.getText().toString().replace("", "");portint = Integer.valueOf(portEditText.getText().toString().replace("", ""));progressBar21.setVisibility(0);//显⽰进度条tcpClientCountDownTimer.cancel();tcpClientCountDownTimer.start();ConnectFlage = true;ShowPointSum = 0;ConnectSeverThread connectSeverThread = new ConnectSeverThread();connectSeverThread.start();}};/***** @author 连接服务器任务**/class ConnectSeverThread extends Thread{public void run(){while(ConnectFlage){try{ipAddress = InetAddress.getByName(Ipstring);socket = new Socket(ipAddress, portint);ConnectFlage = false;tcpClientCountDownTimer.cancel();runOnUiThread(new Runnable(){public void run(){progressBar21.setVisibility(-1);//关闭滚动条AlertDialog21.cancel();//关闭提⽰框}});inputStream = socket.getInputStream();//获取输⼊流}catch (IOException e){// TODO Auto-generated catch blocke.printStackTrace();}}}}/**** 对话框取消按钮事件*/private OnClickListener cancelbutton22Click = new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubConnectFlage = false;//取消连接任务tcpClientCountDownTimer.cancel();//结束定时器progressBar21.setVisibility(-1);//关闭滚动条AlertDialog21.cancel();//关闭对话框}};/**** 延时3s的定时器*/private CountDownTimer tcpClientCountDownTimer = new CountDownTimer(3000,200) { @Overridepublic void onTick(long millisUntilFinished) {//每隔200ms进⼊if (ConnectFlage){ ShowPointSum ++;switch (ShowPointSum%9){ case0:titleEditText.setText("连接中");break;case1:titleEditText.setText("连接中.");break;case2:titleEditText.setText("连接中..");break;case3:titleEditText.setText("连接中...");break;case4:titleEditText.setText("连接中....");break;case5:titleEditText.setText("连接中.....");break;case6:titleEditText.setText("连接中......");break;case7:titleEditText.setText("连接中.......");break;case8:titleEditText.setText("连接中........");break;default:break;}}}@Overridepublic void onFinish() {//3s后进⼊(没有取消定时器的情况下)if (ConnectFlage){ ConnectFlage = false;progressBar21.setVisibility(-1);//关闭滚动条titleEditText.setText("连接服务器失败!!");}tcpClientCountDownTimer.cancel();}};/**** 主按钮点击事件*/private OnClickListener buttonconnect1Click = new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubtitleEditText.setText("连接");AlertDialog21.show();}};/**** 主界⾯连接服务器按钮背景改变*/private OnTouchListener buttonconnect1Touch = new OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stubif (event.getAction()==MotionEvent.ACTION_DOWN) {buttonconnect1.setBackgroundResource(R.drawable.buttondown);}if (event.getAction()==MotionEvent.ACTION_UP) {buttonconnect1.setBackgroundResource(R.drawable.butonup);}return false;}};}现在加上权限然后连接WIFI模块测试⼀下哈<uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/><uses-permission android:name="android.permission.WAKE_LOCK"/><uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/><uses-permission android:name="android.permission.VIBRATE" />连接模块的⽆线然后会发现对话框消失了因为咱们⾃⼰设置的消失现在让它连接后打开控制界⾯还是先把IP和端⼝号的信息做成能够保存的吧咱们就⽤SharedPreferences可以看⼀下这篇⽂章的介绍得到SharedPreferences对象然后那么⼀开始运⾏就要检测是不是记录了,,如果记录了就取出来记录的数据然后显⽰在对应的⽂本框中整体的代码package com.wificardemo;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import .InetAddress;import .Socket;import android.app.Activity;import android.app.AlertDialog;import android.content.SharedPreferences;import android.os.Bundle;import android.os.CountDownTimer;import android.preference.PreferenceManager;import android.renderscript.Mesh.Primitive;import android.view.Menu;import android.view.MenuItem;import android.view.MotionEvent;import android.view.View;import android.view.View.OnClickListener;import android.view.View.OnTouchListener;import android.widget.Button;import android.widget.EditText;import android.widget.ProgressBar;import android.widget.TextView;public class MainActivity extends Activity {Button buttonconnect1;AlertDialog AlertDialog21;//定义⼀个提⽰框View View1;//定义⼀个view⽤来获取咱们⾃定义的界⾯Button connectbutton21;//连接服务器Button cancelbutton22;//取消按钮ProgressBar progressBar21;//进度条EditText iPEditText;//IP地址EditText portEditText;//端⼝号TextView titleEditText;//"连接"String Ipstring="";//记录IP地址int portint=0;//记录端⼝号boolean ConnectFlage=true;int ShowPointSum=0;//显⽰点的数量,连接中.....(后⾯的点)Socket socket = null;//定义socketInetAddress ipAddress;OutputStream outputStream=null;//定义输出流InputStream inputStream=null;//定义输⼊流private SharedPreferences sharedPreferences;//存储数据private SharedPreferences.Editor editor;//存储数据@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setTheme(android.R.style.Theme);//设置主题风格setContentView(yout.activity_main);buttonconnect1 = (Button) findViewById(R.id.button11);//获取按钮buttonconnect1.setOnClickListener(buttonconnect1Click);//按钮点击事件buttonconnect1.setOnTouchListener(buttonconnect1Touch);//按钮的触摸事件/**对话框相关**/AlertDialog21 = new AlertDialog.Builder (MainActivity.this).create();View1 = View.inflate(MainActivity.this, yout.dialog, null);AlertDialog21.setView(View1);//设置显⽰内容为⾃定义的界⾯connectbutton21 = (Button) View1.findViewById(R.id.button21);//连接服务器按钮cancelbutton22 = (Button) View1.findViewById(R.id.Button22);//取消按钮progressBar21 = (ProgressBar) View1.findViewById(R.id.progressBar21);//进度条progressBar21.setVisibility(-1);//进度条不显⽰iPEditText = (EditText)View1.findViewById(R.id.editText21);//IP地址portEditText = (EditText)View1.findViewById(R.id.editText22);//端⼝号titleEditText = (TextView) View1.findViewById(R.id.textView21);//"连接"cancelbutton22.setOnClickListener(cancelbutton22Click);//对话框取消事件connectbutton21.setOnClickListener(connectbutton21Click);//对话框连接按钮点击事件sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);boolean issave = sharedPreferences.getBoolean("save", false);//得到save⽂件存的值,得不到会返回false if (issave){String Ipstring = sharedPreferences.getString("Ipstring", "192.168.4.1");//取出ip,不存在返回192.168.4.1 String portint = sharedPreferences.getString("portint", "8080");//取出端⼝号,不存在返回8080iPEditText.setText(Ipstring);portEditText.setText(portint);}}/**** 对话框连接按钮点击事件*/private OnClickListener connectbutton21Click = new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubIpstring = iPEditText.getText().toString().replace("", "");portint = Integer.valueOf(portEditText.getText().toString().replace("", ""));progressBar21.setVisibility(0);//显⽰进度条tcpClientCountDownTimer.cancel();tcpClientCountDownTimer.start();ConnectFlage = true;ShowPointSum = 0;ConnectSeverThread connectSeverThread = new ConnectSeverThread();connectSeverThread.start();editor = sharedPreferences.edit();editor.putString("Ipstring", Ipstring);//记录ipeditor.putString("portint", portEditText.getText().toString());//记录端⼝号editor.putBoolean("save", true);//写⼊记录标志mit();}};/***** @author 连接服务器任务**/class ConnectSeverThread extends Thread{public void run(){while(ConnectFlage){try{ipAddress = InetAddress.getByName(Ipstring);socket = new Socket(ipAddress, portint);ConnectFlage = false;tcpClientCountDownTimer.cancel();runOnUiThread(new Runnable(){public void run(){progressBar21.setVisibility(-1);//关闭滚动条AlertDialog21.cancel();//关闭提⽰框}});inputStream = socket.getInputStream();//获取输⼊流}catch (IOException e){// TODO Auto-generated catch blocke.printStackTrace();}}}}/**** 对话框取消按钮事件*/private OnClickListener cancelbutton22Click = new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubConnectFlage = false;//取消连接任务tcpClientCountDownTimer.cancel();//结束定时器progressBar21.setVisibility(-1);//关闭滚动条AlertDialog21.cancel();//关闭对话框}};/**** 延时3s的定时器*/private CountDownTimer tcpClientCountDownTimer = new CountDownTimer(3000,200) { @Overridepublic void onTick(long millisUntilFinished) {//每隔200ms进⼊if (ConnectFlage){ ShowPointSum ++;switch (ShowPointSum%9){ case0:titleEditText.setText("连接中");break;case1:titleEditText.setText("连接中.");break;case2:titleEditText.setText("连接中..");break;case3:titleEditText.setText("连接中...");break;case4:titleEditText.setText("连接中....");break;case5:titleEditText.setText("连接中.....");break;case6:titleEditText.setText("连接中......");break;case7:titleEditText.setText("连接中.......");break;case8:titleEditText.setText("连接中........");break;default:break;}}}@Overridepublic void onFinish() {//3s后进⼊(没有取消定时器的情况下)if (ConnectFlage){ ConnectFlage = false;progressBar21.setVisibility(-1);//关闭滚动条titleEditText.setText("连接服务器失败!!");}tcpClientCountDownTimer.cancel();}};/**** 主按钮点击事件*/private OnClickListener buttonconnect1Click = new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubtitleEditText.setText("连接");AlertDialog21.show();}};/**** 主界⾯连接服务器按钮背景改变*/private OnTouchListener buttonconnect1Touch = new OnTouchListener() { @Overridepublic boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stubif (event.getAction()==MotionEvent.ACTION_DOWN) {buttonconnect1.setBackgroundResource(R.drawable.buttondown); }if (event.getAction()==MotionEvent.ACTION_UP) {buttonconnect1.setBackgroundResource(R.drawable.butonup);}return false;}};}现在做控制界⾯<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent" ><TextViewandroid:background="@android:color/background_dark"android:id="@+id/textView31"android:layout_width="wrap_content"android:layout_height="2dp"android:layout_alignParentLeft="true"android:layout_alignParentRight="true"android:layout_centerVertical="true" /><ImageButtonandroid:background="@android:color/transparent"android:layout_marginBottom="20dp"android:id="@+id/imageButton31"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_above="@+id/textView31"android:layout_alignParentLeft="true"android:layout_marginLeft="35dp"android:src="@drawable/qianjin" /><ImageButtonandroid:background="@android:color/transparent"android:layout_marginTop="20dp"android:id="@+id/imageButton32"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignLeft="@+id/imageButton31"android:layout_below="@+id/textView31"android:src="@drawable/houtui" /><ImageButtonandroid:background="@android:color/transparent"android:id="@+id/imageButton33"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:layout_marginRight="10dp"android:src="@drawable/youzhuan" /><ImageButtonandroid:background="@android:color/transparent"android:id="@+id/imageButton34"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_marginRight="30dp"android:layout_toLeftOf="@+id/imageButton33"android:src="@drawable/zuozhuan" /><CheckBoxandroid:id="@+id/checkBox31"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:layout_centerVertical="true"android:text="开重感" /></RelativeLayout>这个ProgressBar默认是,,⽔平的要改成竖直的其实就是⾃⼰写⼀个外观和变化的⽂件,然后调⽤,,,,,就像咱们⾃定义按钮样式⼀样然后呢在⾥⾯加上<?xml version="1.0" encoding="utf-8"?><layer-list xmlns:android="/apk/res/android" >。
基于wifi遥控的智能车1摘要多功能路航两用车以达胜单片机为控制核心,应用红外线光电开关技术自动实现小车的自动避障,选择路线,从而实现陆地快速安全行驶。
飞行部分与小车部分连接,飞行方向的控制主要以摄像头传送到处理系统的图像信息,进行障碍分析以实现自动避障功能。
此功能为了减小处理误差并配合超声波车距模块以达到更精确飞行方向的调整完成自动避障。
摄像部分采用步进电机多方位旋转已达到全面的图像采集。
关键字:达胜单片机、步进电机、红外壁障、超声波测距模块ABSTRACTSmart car for the control of the core, the application of infrared photoelectric switch, maze algorithms to achieve 8-bit microcontroller AT89S52 car automatic obstacle avoidance, route selection to find the destination. Electromagnetic relay to complete the pick up the task of sheet iron, in return when measured by the servo motor encoder phase, in the maze to find the optimal path to the smooth return of the whole process of the timer recording time.Keyword:AT89S52MCU、deceleration motor、IR barrier、encoding motor、electromagnetic relay目录摘要 (1)1 系统设计 (4)1.1 设计背景 (4)1.2结构的设计 (4)1.3模块方案比较与论证 (4)1.3.1 蔽障检测和测距模块 (4)1.3.2单片机控制模块 (5)1.3.3电机控制模块 (5)1.3.4 航拍功能、机械手臂 (6)1.3.5 kk飞控板,无刷电机 (6)1.4创新点 (6)2系统的硬件电路设计 (6)2.1 达盛单片机控制模块 (6)2.2 直流稳压电源 (7)2.3 红外光电开关模块 (8)2.4 电机驱动模块 (8)3 软件系统设计及实现软件设计 (9)3.1 开发软件及编程语言简介 (9)4作品概述 (9)5可行性: (10)6总结 (10)5参考文献: (11)1 系统设计1.1 设计背景在山区勘探或受自然灾严重地区,道路运输不便,使用该设计的多功能两用车,可以发挥其飞行功能。
UCOSIII控制STM32wifi⼩车代码/***********************************************这使⽤信号量,然后直接控制为wifi⼩车*******************************************/ #include "sys.h"#include "delay.h"#include "usart.h"#include "led.h"#include "lcd.h"#include "key.h"#include "pwm.h"#include "track.h"#include "includes.h"//UCOSIII中以下优先级⽤户程序不能使⽤,ALIENTEK//将这些优先级分配给了UCOSIII的5个系统内部任务//优先级0:中断服务服务管理任务 OS_IntQTask()//优先级1:时钟节拍任务 OS_TickTask()//优先级2:定时任务 OS_TmrTask()//优先级OS_CFG_PRIO_MAX-2:统计任务 OS_StatTask()//优先级OS_CFG_PRIO_MAX-1:空闲任务 OS_IdleTask()#define START_TASK_PRIO 3 //任务优先级#define START_STK_SIZE 1024 //任务堆栈⼤⼩OS_TCB StartTaskTCB; //任务控制块CPU_STK START_TASK_STK[START_STK_SIZE];//任务堆栈void start_task(void *p_arg); //任务函数#define forward_TASK_PRIO 4 //任务优先级#define forward_STK_SIZE 128 //任务堆栈⼤⼩OS_TCB forward_TaskTCB; //任务控制块CPU_STK forward_TASK_STK[forward_STK_SIZE];//任务堆栈void forward_task(void *p_arg); //任务函数#define back_TASK_PRIO 5 //任务优先级#define back_STK_SIZE 128 //任务堆栈⼤⼩OS_TCB back_TaskTCB; //任务控制块CPU_STK back_TASK_STK[back_STK_SIZE];//任务堆栈void back_task(void *p_arg); //任务函数#define stop_TASK_PRIO 6 //任务优先级#define stop_STK_SIZE 128 //任务堆栈⼤⼩OS_TCB stop_TaskTCB; //任务控制块CPU_STK stop_TASK_STK[stop_STK_SIZE];//任务堆栈void stop_task(void *p_arg); //任务函数#define turnright_TASK_PRIO 7 //任务优先级#define turnright_STK_SIZE 128 //任务堆栈⼤⼩OS_TCB turnright_TaskTCB; //任务控制块CPU_STK turnright_TASK_STK[turnright_STK_SIZE];//任务堆栈void turnright_task(void *p_arg); //任务函数#define turnleft_TASK_PRIO 8 //任务优先级#define turnleft_STK_SIZE 128 //任务堆栈⼤⼩OS_TCB turnleft_TaskTCB; //任务控制块CPU_STK turnleft_TASK_STK[turnleft_STK_SIZE]; //任务堆栈void turnleft_task(void *p_arg); //任务函数#define quick_TASK_PRIO 9 //任务优先级#define quick_STK_SIZE 128 //任务堆栈⼤⼩OS_TCB quick_TaskTCB; //任务控制块CPU_STK quick_TASK_STK[quick_STK_SIZE];//任务堆栈void quick_task(void *p_arg); //任务函数#define slow_TASK_PRIO 10 //任务优先级#define slow_STK_SIZE 128 //任务堆栈⼤⼩OS_TCB slow_TaskTCB; //任务控制块CPU_STK slow_TASK_STK[slow_STK_SIZE]; //任务堆栈void slow_task(void *p_arg); //任务函数#define track_TASK_PRIO 11 //任务优先级#define track_STK_SIZE 128 //任务堆栈⼤⼩OS_TCB track_TaskTCB; //任务控制块CPU_STK track_TASK_STK[track_STK_SIZE];//任务堆栈void track_task(void *p_arg); //任务函数#define usartcheck_TASK_PRIO 12 //任务优先级#define usartcheck_STK_SIZE 128 //任务堆栈⼤⼩OS_TCB usartcheck_TaskTCB; //任务控制块CPU_STK usartcheck_TASK_STK[usartcheck_STK_SIZE];//任务堆栈void usartcheck_task(void *p_arg); //任务函数OS_SEM forward_SEM; //定义信号量OS_SEM back_SEM; //定义信号量OS_SEM stop_SEM; //定义信号量OS_SEM turnright_SEM;//定义信号量OS_SEM turnleft_SEM; //定义信号量OS_SEM quick_SEM; //定义信号量OS_SEM slow_SEM; //定义信号量OS_SEM track_SEM; //定义信号量//s16 ini_ccr=60;//赋值给⽐较捕获寄存器CCR的初值//s16 com_ccr=60;//赋值给⽐较捕获寄存器CCR的公共值//主函数int main(void){OS_ERR err;CPU_SR_ALLOC();delay_init(); //时钟初始化//NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断分组配置//uart_init(115200); //串⼝初始化//LED_Init(); //LED初始化//LCD_Init(); //LCD初始化//KEY_Init(); //按键初始化TIM1_PWM_Init(100,9);uart_init(115200); //串⼝初始化track_init();OSInit(&err); //初始化UCOSIIIOS_CRITICAL_ENTER(); //进⼊临界区//创建开始任务OSTaskCreate((OS_TCB * )&StartTaskTCB, //任务控制块(CPU_CHAR * )"start task", //任务名字(OS_TASK_PTR )start_task, //任务函数(void * )0, //传递给任务函数的参数(OS_PRIO )START_TASK_PRIO, //任务优先级(CPU_STK * )&START_TASK_STK[0], //任务堆栈基地址(CPU_STK_SIZE)START_STK_SIZE/10, //任务堆栈深度限位(CPU_STK_SIZE)START_STK_SIZE, //任务堆栈⼤⼩(OS_MSG_QTY )0, //任务内部消息队列能够接收的最⼤消息数⽬,为0时禁⽌接收消息 (OS_TICK )0, //当使能时间⽚轮转时的时间⽚长度,为0时为默认长度,(void * )0, //⽤户补充的存储区(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任务选项(OS_ERR * )&err); //存放该函数错误时的返回值OS_CRITICAL_EXIT(); //退出临界区OSStart(&err); //开启UCOSIII}//开始任务函数void start_task(void *p_arg)//void *p_arg是空类型(⽆类型)指针,由函数内部强制转换为某⼀具体类型的指针{OS_ERR err;CPU_SR_ALLOC();p_arg = p_arg;//表⽰暂时不⽤p_arg,防⽌编译器告警//(void)p_arg;//表⽰暂时不⽤p_arg,防⽌编译器告警CPU_Init();#if OS_CFG_STAT_TASK_EN > 0uOSStatTaskCPUUsageInit(&err); //统计任务#endif#ifdef CPU_CFG_INT_DIS_MEAS_EN //如果使能了测量中断关闭时间CPU_IntDisMeasMaxCurReset();#endif#if OS_CFG_SCHED_ROUND_ROBIN_EN //当使⽤时间⽚轮转的时候//使能时间⽚轮转调度功能,时间⽚长度为1个系统时钟节拍,既1*5=5msOSSchedRoundRobinCfg(DEF_ENABLED,1,&err);#endifOS_CRITICAL_ENTER(); //进⼊临界区OSSemCreate ((OS_SEM* )&forward_SEM, //创建信号量forward_SEM (CPU_CHAR* )"forward_SEM",(OS_SEM_CTR)0,(OS_ERR* )&err);OSSemCreate ((OS_SEM* )&back_SEM, //创建信号量back_SEM(CPU_CHAR* )"back_SEM",(OS_SEM_CTR)0,(OS_ERR* )&err);OSSemCreate ((OS_SEM* )&stop_SEM, //创建信号量stop_SEM(CPU_CHAR* )"stop_SEM",(OS_SEM_CTR)0,(OS_ERR* )&err);OSSemCreate ((OS_SEM* )&turnright_SEM, //创建信号量turnright_SEM (CPU_CHAR* )"turnright_SEM",(OS_SEM_CTR)0,(OS_ERR* )&err);OSSemCreate ((OS_SEM* )&turnleft_SEM, //创建信号量turnleft_SEM (CPU_CHAR* )"turnleft_SEM",(OS_SEM_CTR)0,(OS_ERR* )&err);OSSemCreate ((OS_SEM* )&quick_SEM, //创建信号量quick_SEM(CPU_CHAR* )"quick_SEM",(OS_SEM_CTR)0,(OS_ERR* )&err);OSSemCreate ((OS_SEM* )&slow_SEM, //创建信号量slow_SEM(CPU_CHAR* )"slow_SEM",(OS_SEM_CTR)0,(OS_ERR* )&err);OSSemCreate ((OS_SEM* )&track_SEM, //创建信号量track_SEM(CPU_CHAR* )"track_SEM",(OS_SEM_CTR)0,(OS_ERR* )&err);//创建任务forward_taskOSTaskCreate((OS_TCB * )&forward_TaskTCB,(CPU_CHAR * )"forward_task",(OS_TASK_PTR )forward_task,(void * )0,(OS_PRIO )forward_TASK_PRIO,(CPU_STK * )&forward_TASK_STK[0],(CPU_STK_SIZE)forward_STK_SIZE/10,(CPU_STK_SIZE)forward_STK_SIZE,(OS_MSG_QTY )0,(OS_TICK )0,(void * )0,(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err);//创建任务back_taskOSTaskCreate((OS_TCB * )&back_TaskTCB,(CPU_CHAR * )"back_task",(OS_TASK_PTR )back_task,(void * )0,(CPU_STK * )&back_TASK_STK[0],(CPU_STK_SIZE)back_STK_SIZE/10,(CPU_STK_SIZE)back_STK_SIZE,(OS_MSG_QTY )0,(OS_TICK )0,(void * )0,(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err);//创建任务stop_taskOSTaskCreate((OS_TCB * )&stop_TaskTCB,(CPU_CHAR * )"stop_task",(OS_TASK_PTR )stop_task,(void * )0,(OS_PRIO )stop_TASK_PRIO,(CPU_STK * )&stop_TASK_STK[0],(CPU_STK_SIZE)stop_STK_SIZE/10,(CPU_STK_SIZE)stop_STK_SIZE,(OS_MSG_QTY )0,(OS_TICK )0,(void * )0,(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err);//创建任务turnright_taskOSTaskCreate((OS_TCB * )&turnright_TaskTCB,(CPU_CHAR * )"turnright_task",(OS_TASK_PTR )turnright_task,(void * )0,(OS_PRIO )turnright_TASK_PRIO,(CPU_STK * )&turnright_TASK_STK[0],(CPU_STK_SIZE)turnright_STK_SIZE/10,(CPU_STK_SIZE)turnright_STK_SIZE,(OS_MSG_QTY )0,(OS_TICK )0,(void * )0,(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err);//创建任务turnleft_taskOSTaskCreate((OS_TCB * )&turnleft_TaskTCB,(CPU_CHAR * )"turnleft_task",(OS_TASK_PTR )turnleft_task,(void * )0,(OS_PRIO )turnleft_TASK_PRIO,(CPU_STK * )&turnleft_TASK_STK[0],(CPU_STK_SIZE)turnleft_STK_SIZE/10,(CPU_STK_SIZE)turnleft_STK_SIZE,(OS_MSG_QTY )0,(OS_TICK )0,(void * )0,(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err);//创建任务quick_taskOSTaskCreate((OS_TCB * )&quick_TaskTCB,(CPU_CHAR * )"quick_task",(OS_TASK_PTR )quick_task,(void * )0,(OS_PRIO )quick_TASK_PRIO,(CPU_STK * )&quick_TASK_STK[0],(CPU_STK_SIZE)quick_STK_SIZE/10,(CPU_STK_SIZE)quick_STK_SIZE,(OS_MSG_QTY )0,(OS_TICK )0,(void * )0,(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err);//创建任务slow_taskOSTaskCreate((OS_TCB * )&slow_TaskTCB,(CPU_CHAR * )"slow_task",(void * )0,(OS_PRIO )slow_TASK_PRIO,(CPU_STK * )&slow_TASK_STK[0],(CPU_STK_SIZE)slow_STK_SIZE/10,(CPU_STK_SIZE)slow_STK_SIZE,(OS_MSG_QTY )0,(OS_TICK )0,(void * )0,(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,(OS_ERR * )&err);//创建任务track_taskOSTaskCreate((OS_TCB * )&track_TaskTCB,(CPU_CHAR * )"track_task",(OS_TASK_PTR )track_task,(void * )0,(OS_PRIO )track_TASK_PRIO,(CPU_STK * )&track_TASK_STK[0],(CPU_STK_SIZE)track_STK_SIZE/10,(CPU_STK_SIZE)track_STK_SIZE,(OS_MSG_QTY )0,(OS_TICK )0,(void * )0,(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,(OS_ERR * )&err);//创建任务usartcheck_taskOSTaskCreate((OS_TCB * )&usartcheck_TaskTCB,(CPU_CHAR * )"usartcheck_task",(OS_TASK_PTR )usartcheck_task,(void * )0,(OS_PRIO )usartcheck_TASK_PRIO,(CPU_STK * )&usartcheck_TASK_STK[0],(CPU_STK_SIZE)usartcheck_STK_SIZE/10,(CPU_STK_SIZE)usartcheck_STK_SIZE,(OS_MSG_QTY )0,(OS_TICK )0,(void * )0,(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,(OS_ERR * )&err);OS_CRITICAL_EXIT(); //退出临界区OSTaskDel((OS_TCB*)0,&err); //删除start_task任务⾃⾝}//任务usartcheck_task的任务函数void usartcheck_task(void *p_arg){OS_ERR err;u8 Res;while(1){if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)!=RESET){Res =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据switch(Res)//{case 'A'://前进{OSSemPost(&forward_SEM,OS_OPT_POST_1,&err); //发送信号量forward_SEM break;}case 'b'://后退{OSSemPost(&back_SEM,OS_OPT_POST_1,&err); //发送信号量back_SEMbreak;}case 'C'://停⽌{OSSemPost(&stop_SEM,OS_OPT_POST_1,&err); //发送信号量stop_SEMbreak;}case 'r'://右转{OSSemPost(&turnright_SEM,OS_OPT_POST_1,&err);//发送信号量turnright_SEM break;}case 'l'://左转{OSSemPost(&turnleft_SEM,OS_OPT_POST_1,&err); //发送信号量turnleft_SEM break;}case 'k'://加速{OSSemPost(&quick_SEM,OS_OPT_POST_1,&err); //发送信号量quick_SEMbreak;}case 'm'://减速{OSSemPost(&slow_SEM,OS_OPT_POST_1,&err); //发送信号量slow_SEMbreak;}case 't'://循迹{OSSemPost(&track_SEM,OS_OPT_POST_1,&err); //发送信号量track_SEMbreak;}default: break;}}}}//任务forward_task的任务函数void forward_task(void *p_arg){OS_ERR err;OSSemPend(&forward_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); //等待信号量forward(ini_ccr);}//任务back_task的任务函数void back_task(void *p_arg){OS_ERR err;OSSemPend(&back_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); //等待信号量back(ini_ccr);}//任务stop_task的任务函数void stop_task(void *p_arg){OS_ERR err;OSSemPend(&stop_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); //等待信号量stop();}//任务turnright_task的任务函数void turnright_task(void *p_arg){OS_ERR err;OSSemPend(&turnright_SEM,0,OS_OPT_PEND_BLOCKING,0,&err);//等待信号量turn_right();}//任务turnleft_task的任务函数void turnleft_task(void *p_arg){OS_ERR err;OSSemPend(&turnleft_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); //等待信号量turn_left();}//任务quick_task的任务函数void quick_task(void *p_arg){OS_ERR err;OSSemPend(&quick_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); //等待信号量 quick();}//任务slow_task的任务函数void slow_task(void *p_arg){OS_ERR err;OSSemPend(&slow_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); //等待信号量 slow();}//任务track_task的任务函数void track_task(void *p_arg){OS_ERR err;OSSemPend(&track_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); //等待信号量 while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==RESET){track();}}。
#include< reg51.h >#define uchar unsigned char#define uint unsigned int#define MOTOR_C P1 //P1口作为电机的控制口。
//#define SIGNAL P3 //P3口的低两位为循迹传感器输入口。
#define SHELVES 10 //速度总档数。
#define BACK 0xfa //后退。
#define FORWARD 0xf5 //前进。
#define WXYK P2 //无线遥控sbit senserr = P3^2; //(右)循迹。
sbit senserl = P3^3; //(左)循迹。
sbit hwr = P3^0; //(前)红外壁障传感器入口。
sbit hwl = P3^1; //(后)红外壁障传感器入口。
sbit PWM_R = P1^0; //右电机PWM输入口。
sbit PWM_L = P1^2; //左电机PWM输入口。
sbit PWM_HR = P1^1; //(后退)右电机。
sbit PWM_HL = P1^3; //(后退)左电机。
sbit wxr_a = P2^4; //无线遥控接收端D0sbit wxb_b = P2^5; //无线遥控接收端D1sbit wxl_c = P2^6; //无线遥控接收端D2sbit wxs_d = P2^7; //无线遥控接收端D3void timer0_init( void ); //定时器0初始化函数。
void timer1_init( void ); //定时器1初始化函数。
void right( void ); //前进右转弯函数。
void left( void ); //前进左转弯函数。
void forward( void ); //前进函数。
void hright(void); //后退右转函数。
void hleft(void); //后退左转函数。
10.16638/ki.1671-7988.2021.05.021基于WIFI的无线便携式汽车轴重称重系统设计与实现杨伦,余康,徐瑞利(中航电测仪器股份有限公司,陕西西安710119)摘要:汽车已是人们日常生活中必不可少的交通运输工具,制造厂商在其设计定型前需要做大量的检测,以保证汽车的安全运行,重心检测就是汽车整车性能检测中的一个重要项。
本系统就是根据用户对汽车轴重称重的需求,在板式称重传感器的基础上,采用高精度数据采集和无线信号传输技术,设计并实现了基于Wi-Fi的无线便携式汽车轴重称重系统。
经用户现场测试验证,系统运行稳定可靠,满足实际工程应用的需求。
关键词:汽车轴重称重;板式称重传感器;Wi-Fi;高精度数据采集中图分类号:U467 文献标识码:A 文章编号:1671-7988(2021)05-72-04Wi-fi-based Wireless Portable Axle Load Weighing System for AutomobileDesign and ImplementationYang Lun, Yu Kang, Xu Ruili(Zhonghang Electronic Measuring Instruments Co. Ltd., Shaanxi Xi'an 710119)Abstract:The car has been an essential means of transportation in People's Daily life, the manufacturers in its design before finality need to do lot’s of testing, to ensure the safety of the car, the center of gravity testing is an important item in the performance of the car. A Wi-fi-based wireless portable axle load weighing system for automobiles is designed and implemented based on the requirements of users for axle load weighing, using high-precision data acquisition and wireless signal transmission technology on the basis of plate type load cell. The system runs stably and reliably, meets the require -ments of engineering application.Keywords: Automobile axle load weighing; Plate type load cell; Wi-fi; High precision data acquisitionCLC NO.: U467 Document Code: A Article ID: 1671-7988(2021)05-72-04前言对汽车重心位置的计算与检测,为设计人员合理分配汽车轴重和轮重提供有效数据,帮助改善汽车的运行稳定性,并且车辆最终定型前也需要通过重心检测试验[1]。
四川信息职业技术学院毕业设计说明书设计题目:基于89C52单片机的WIFI智能小车设计专业: 应用电子技术班级: 应电10-1学号:姓名:指导教师:二〇一二年十二月三日目录摘要 (1)第1章论述 (2)第2章方案论证及选择 (4)2.1总体设计方案 (4)2.1.1整机系统 (4)2.1.2整机工作原理 (5)2.2系统方案的选择与比较 (5)第3章硬件电路设计 (6)3.1DB120-WG无线路由器 (6)3.1.1刷机固件介绍 (6)3.1.2刷机步骤 (7)3.2单片机最小系统设计 (9)3.2.1 主控制芯片89C52 (9)3.2.2 STC89C52RC单片机最小系统 (11)3.2.3 89C52单片机的使用 (13)3.3电机驱动电路 (14)3.3.1电机驱动模块使用 (14)3.3.2驱动原理及电路图 (15)3.3.3驱动模块原理及电路原理图 (15)3.4摄像头介绍 (16)3.4.1摄像头简介 (16)3.4.2摄像头的分类 (17)3.4.3摄像头的工作原理 (17)3.4.4摄像头的主要结构和组件 (17)3.5舵机 (18)3.5.1舵机的控制 (18)3.5.2舵机的作用 (19)3.6电源模块 (19)3.6.1 LM78系列集成稳压芯片介绍 (19)3.6.2稳压电路 (20)3.7路由器及驱动模块供电模块LM2596 (20)3.7.1 LM2596系列开关稳压集成电路的主要特性 (21)3.7.2 LM2596构成的可调压电源模块 (21)3.8灯光、蜂鸣器及电平转换电路设计 (23)第4章系统程序设计 (24)4.1系统程序简介 (24)4.2程序流程图 (24)4.2.1主程序流程图 (24)4.2.2串口中断子函数流程图 (25)4.2.3定时器2中断子函数流程图 (25)4.2.4避障子函数流程图 (26)4.2.5寻迹函数流程图 (26)第5章制作与调试 (29)5.1系统仿真 (29)5.1.1 常用软件介绍 (29)5.1.2 仿真测试 (30)5.2实物调试 (31)结论 (32)参考文献 (33)附录1 系统设计原理图 (34)附录2 元器件明细表 (35)附录3 源程序 (36)摘要WIFI智能小车由电机、小车车体、89C52控制芯片、WIFI收发模块、电机驱动、舵机、电源、摄像头等主要部件以及灯光、蜂鸣器、电平转换等辅助模块构成。
#include<reg52.h>#include<math.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar Buffer =0; //从串口接收的数据uint URTAReceivedCount=0,n=1;uchar data Tempdatatable[5],CommandDatatable[5];//数据包uchar serVal[2];uint pwm[]={1120,1190,1382,1382,1382,1382,1382,1382}; //初始90度,(实际是1382.4,取整得1382)uchar pwm_flag=0;uint code ms0_5Con=461; //0.5ms计数(实际是460.8,取整得461)uint code ms2_5Con=2304; //2.5ms计数bit key_stime_ok;sbit StatusLight=P2^0; //状态灯sbit MainLight=P2^1; //主大灯sbit servo0=P0^0; //舵机控制sbit servo1=P0^1;sbit servo2=P0^2;sbit servo3=P0^3;sbit servo4=P0^4;sbit servo5=P0^5;sbit servo6=P0^6;sbit servo7=P0^7;//定义智能小车驱动模块输入IOsbit IN1 = P1^0; // 高电平1 后退(反转)sbit IN2 = P1^1; // 高电平1 前进(正转)sbit IN3 = P1^2; // 高电平1 前进(正转)sbit IN4 = P1^3; // 高电平1 后退(反转)sbit EN1 = P1^4; // 高电平使能sbit EN2 = P1^5; // 高电平使能/********************************************************************* 名称: Delay_1ms()* 功能: 延时子程序,延时时间为1ms * x* 输入: x (延时一毫秒的个数)* 输出: 无***********************************************************************/void Delay_1ms(uint i)//1ms延时{uchar x,j;for(j=0;j<i;j++)for(x=0;x<=148;x++);}void TurnOnStatusLight(){StatusLight=0;}/********************************************************************* 名称: Send_Data()* 功能: 向上位机传送字符* 输入: 无* 输出: 无***********************************************************************/void Send_Data(uchar type,uchar cmd,uchar dat){uchar data Buffer[5];//构建数据包uchar *p;uint Send_Count=0;p = Buffer;Buffer[0]=0XFF;Buffer[1]=type;Buffer[2]=cmd;Buffer[3]=dat;Buffer[4]=0XFF;while(1){if(*p==0XFF){Send_Count++; //0XFF标志统计位}SBUF = *p; //发送while(!TI) //如果发送完毕,硬件会置位TI,等待发送完毕{_nop_();}p++;TI = 0;if(Send_Count == 2) //当统计到两次出现0XFF,则认为一个数据包发送完毕,跳出循环{TI = 0;break;}}}/********************************************************************协议规定:包头类型位数据位数据位结束位0XFF 0X** OX** 0X** 0XFF各命令说明:类型位数据位数据位功能0X00 0X02 0X00 前进0X00 0X01 0X00 后退0X00 0X03 0X00 左转0X00 0X04 0X00 右转0X00 0X00 0X00 停止0X01 0X01 角度舵机10X01 0X02 . 舵机20X01 0X01 . 舵机30X01 0X02 . 舵机40X01 0X01 . 舵机50X01 0X02 . 舵机60X01 0X01 . 舵机70X01 0X02 数据舵机80X02 0X01 车灯亮0X02 0X02 车灯灭0X03 雷达数据发送雷达数据***********************************************************************/ /********************************************************************* 名称: Com_Int()* 功能: 串口中断子函数***********************************************************************/ void Com_Int(void) interrupt 4{uchar temp;ES=0; //关串口中断RI=0; //软件清除接收中断temp=SBUF;if(temp==0XFF && URTAReceivedCount<3){Tempdatatable[0]==0XFF; //包头URTAReceivedCount++;}else{Tempdatatable[n]=temp;n++;if(URTAReceivedCount==0&&n==2)n=1;}if(URTAReceivedCount==2)//包尾{Tempdatatable[0]=0XFF;Tempdatatable[4]=0XFF;n=1;URTAReceivedCount=0; //组包完毕temp="";// Send_Data(Tempdatatable[1],Tempdatatable[2],Tempdatatable[3]); //发送组成的数据包回去}CommandDatatable[0]=Tempdatatable[0];CommandDatatable[1]=Tempdatatable[1];CommandDatatable[2]=Tempdatatable[2];CommandDatatable[3]=Tempdatatable[3];CommandDatatable[4]=Tempdatatable[4];ES=1;//开串口中断}/********************************************************************* 名称: Com_Init()* 功能: 串口初始化,晶振11.0592,波特率9600,使能了串口中断***********************************************************************/void Com_Init(void){TMOD = 0x21;PCON = 0x00;SCON = 0x50;TH1 = 0xFd; //设置波特率9600TL1 = 0xFd;TR1 = 1; //启动定时器1ES = 1; //开串口中断EA = 1; //开总中断IT0=0;EX0=1;}/********************************************************************* 名称:Moto_Forward()* 功能: 电机1、2启动,都是前进,整车表现为前进。
基于STM32的重力感应无线智能遥控小车设计作者:李志瑞申庆超来源:《物联网技术》2017年第10期摘要:针对传统智能小车遥控端是物理按键或触摸屏按键控制的缺点,文中基于STM32设计了一款重力感应无线智能遥控小车,该系统由手持遥控端与智能小车组成。
其中手持遥控端利用倾角传感器ADXL345检测倾角信息,经卡尔曼滤波之后,送入STM32进行处理并转换为相应指令,通过nRF24L01模块无线发送给智能小车,由STM32F103C8Tx控制电机驱动模块L298N驱动小车前进、后退、左转、右转等。
文中设计的重力感应无线智能遥控小车引入卡尔曼滤波实现精确控制,具有简单、直观、方便、易操作等特点,应用前景广泛。
关键词:STM32控制器;无线;重力感应;倾角中图分类号:TP39;TN92.5 文献标识码:A 文章编号:2095-1302(2017)10-00-030 引言随着社会进步,电子消费产品的需求越来越高,遥控智能车辆以及在智能化车辆基础上开发出来的产品已广泛应用到自动化物流运输等领域。
目前,遥控智能车辆大多采用无线传输方式,而无线传输逐渐取代有线传输不仅是因为“无线”,更因为在安装、增减节点方面都比有线方式方便、快捷,因此得到了广泛的应用[1]。
本设计首先采集手持遥控端的倾角信息并进行处理、生成指令,然后无线发送给智能小车,赋予智能小车更灵活的运动状态和更宽广的运动范围。
设计灵活,操作方便,控制稳定,制作成本低,可应用于视线可观察但人体涉及不到的区域,可制作成高端智能玩具,或应用于工业控制,与实际相结合,有良好的现实意义和市场经济价值[2]。
1 系统硬件电路设计采用整体设计的方法进行设计,系统硬件主要由两大部分构成[3],即以NUCLEO-L053为控制核心的手持遥控端和以STM32F103C8Tx为控制核心的智能小车。
手持遥控端是以ADXL345、OLED12864与nRF24L01为基础的检测倾角装置,显示参数装置和无线发射装置。
话说上次已经实现用Android(安卓)手机对智能小车机器人进行遥控操作,但是···但是····还是要用手指按屏幕·····本人一向懒惰出名,连手指都不打算用,怎么办?所以这次利用手机的重力感应系统,用Java开发了一个Android重力感应遥控程序,操作者只需要改变手机的位置,程序就能把手机的空间状态转换成指令,发送给智能小车机器人,从而实现对其进行遥控,这下连手指都省了,就差直接用意念控制了,但是这个我是做不出的······手机还是上次的那个Android手机,开发工具还是Eclipse ,语言就不用说了,Java。
这是视频:下面是手机端开发过程和源代码:用Eclipse新建一个命名为AccelerometerDemo的Android工程,这就不多说了。
然后是权限申明,和之前的一样,这里不再累述。
如果不声明将无法使用手机蓝牙功能。
最后打开Activity,添加重力感应遥控智能小车的代码如下:package com.AccelerometerDemo.www;import java.io.IOException;import java.io.OutputStream;import java.util.List;import java.util.UUID;import android.app.Activity;import android.bluetooth.BluetoothAdapter;import android.bluetooth.BluetoothDevice;import android.bluetooth.BluetoothSocket;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.hardware.Sensor;import android.hardware.SensorEvent;import android.hardware.SensorEventListener;import android.hardware.SensorManager;import android.os.Bundle;import android.util.Log;import android.view.Gravity;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.widget.T oast;public class AccelerometerDemo extends Activity implements SensorEventListener{/** Called when the activity is first created. */private SensorManager sensorManager;private MySurfaceView view;private Object[] accelerometer={"X轴加速度值:","Y轴加速度值:","Z轴加速度值:",};private BluetoothAdapter mBluetoothAdapter = null;private BluetoothSocket btSocket = null;private OutputStream outStream = null;private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");private static String address = "00:11:03:21:00:43"; // <==要连接的蓝牙设备MAC 地址@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);sensorManager=(SensorManager)getSystemService(SENSOR_SERVICE);view=new MySurfaceView(this);setContentView(view);mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();if (mBluetoothAdapter == null) {T oast.makeT ext(this, "蓝牙设备不可用,请打开蓝牙!", T oast.LENGTH_LONG).show();finish();return;}if (!mBluetoothAdapter.isEnabled()) {T oast.makeT ext(this, "请打开蓝牙并重新运行程序!", T oast.LENGTH_LONG).show();finish();return;}}@Overridepublic void onStart() {super.onStart();}@Overrideprotected void onResume(){super.onResume();List<Sensor>sensors=sensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER);if(sensors.size()>0){sensorManager.registerListener(this,sensors.get(0),SensorManager.SENSOR_DELAY_FASTEST);}DisplayT oast("正在尝试连接智能小车,请稍后····");BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);try {btSocket = device.createRfcommSocketT oServiceRecord(MY_UUID);} catch (IOException e) {DisplayT oast("套接字创建失败!");}DisplayT oast("成功连接智能小车!可以开始操控了~~~"); mBluetoothAdapter.cancelDiscovery();try {btSocket.connect();DisplayT oast("连接成功建立,数据连接打开!"); } catch (IOException e) {try {btSocket.close();} catch (IOException e2) {DisplayT oast("连接没有建立,无法关闭套接字!"); }}}@Overrideprotected void onPause(){super.onPause();sensorManager.unregisterListener(this);if (outStream != null) {try {outStream.flush();} catch (IOException e) {}}try {btSocket.close();} catch (IOException e2) {DisplayT oast("套接字关闭失败!");}}@Overridepublic void onStop() {super.onStop();}@Overridepublic void onDestroy() {super.onDestroy();}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {// TODO Auto-generated method stub}@Overridepublic void onSensorChanged(SensorEvent event) {// TODO Auto-generated method stubview.onValueChanged(event.values);}public void DisplayT oast(String str){T oast toast=T oast.makeT ext(this, str, T oast.LENGTH_LONG);toast.setGravity(Gravity.TOP, 0, 220);toast.show();}class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback{ private float x,y,z;public MySurfaceView(Context context){super(context);getHolder().addCallback(this);}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {// TODO Auto-generated method stubx=(getWidth())/2;y=(getHeight())/2;onValueChanged(new float[3]);}@Overridepublic void surfaceCreated(SurfaceHolder holder) {// TODO Auto-generated method stub}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {// TODO Auto-generated method stub}@SuppressWarnings("static-access")void onValueChanged(float[] values){String message;byte[] msgBuffer;z=(int)(2+values[2]/5);x=(getWidth())/2;y=(getHeight())/2;x-=values[0]*10;y+=values[1]*10;Canvas canvas=getHolder().lockCanvas();if(canvas!=null){Paint paint=new Paint();Paint paint1=new Paint();paint1.setAntiAlias(true);paint1.setColor(Color.RED);paint1.setT extSize(38);paint.setAntiAlias(true);paint.setColor(Color.BLUE);paint.setT extSize(36);canvas.drawColor(Color.WHITE);canvas.drawT ext("BY Liuviking", 50, 50, paint1);for(int i=0;i<values.length;i++){canvas.drawT ext(accelerometer[i]+":"+(int)values[i], 0, paint.getT extSize()*(i+1)+90,paint);}getHolder().unlockCanvasAndPost(canvas);}//这段代码的作用是实时显示获取的重力加速度值。