嵌入式课程设计——蓝牙无线数据传输_第1页
嵌入式课程设计——蓝牙无线数据传输_第2页
嵌入式课程设计——蓝牙无线数据传输_第3页
嵌入式课程设计——蓝牙无线数据传输_第4页
嵌入式课程设计——蓝牙无线数据传输_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 嵌入式系统实训报告书课 程 设 计 书 嵌入式系统实训 学院 姓名 学号 组别 目录1设计概述22设计方案22.1详细设计方案32.1.1 电源模块32.1.2 主芯片模块32.1.3 WIFI模块42.1.4 霍尔传感器模块42.1.5 开关磁阻电机52.1.6 电路板抗干扰设计62.2软件设计方案73手机客户端APP设计73.1开发环境的搭建73.2手机APP的主要功能模块84软件件调试过程和结果165课程总结201设计概述能源是经济发展和社会进步的支柱,能源问题成为当今世界各国尤其是发达国家所要解决的头等大事。世界各国都在鼓励大力开发可再生能源。风能和太阳能成为当下最受欢迎的新能源,也

2、是目前可再生能源应用技术中最成熟的。本设计基于人体运动出来的机械能转化成可利用回收的电能,是新能源的一种体现,具有很好的开发前景和实际用途。该设计是基于以stm32f030芯片为主芯片的智能发电的PCB主板,再利用开关磁阻电机进行发电,将其电压和电流通过wifi模块发送给手机端,通过手机上的APP可以显示出电流和电压值,并进行后台处理和数据保存。设计将从芯片器件的选型再到PCB板的设计,之后是PCB板的焊接,再是软件的编写与调试,软件部分还包括手机APP的编写,最终完成本次设计。1 设计方案该设计方案可以划分为两个部分,第一部分是终端部分,有发电机的驱动模块,电压电流采集模块,WiFi模块以和

3、主控芯片及其外设;第二部分是手机部分,该部分主要是实现一个上位机的功能,包括接收信息,发送指令,主要有登录界面和查询界面。两部分之间通过WIFI来实现通信。所以总体设计框图1所示: 蓝牙信号 手机端 终端部分图2.1 总体设计方案其中手机端的设计为纯粹的软件设计,而智能发电系统主体的设计方案是方案设计中的重点部分包括硬件部分的设计与软件部分的设计。该系统的设计方案包括以下几个方面,一是小车主体电路板的设计方案,属于硬件部分的设计;二是软件设计方案,属于软件部分的设计,主要是用于驱动硬件电路和给手机端APP提供操作接口。该系统主体电路板的设计包括电源模块的设计,主芯片外围电路的设计,WiFi模块

4、的设计,电机驱动模块的设计,各个传感器模块的设计。软件部分的设计包括主体函数的设计及各个功能模块的设计,在实现了各个功能模块设计的基础上设计出主体程序,以便可以随时中断某一个功能而去实现另外的功能。外围设计主要是各个传感器的放置位置的选择,以便达到所需的功能。1.1 详细设计方案 2.1.1 电源模块由于电机的驱动需要15V的电源,而USB及传感器等模块的供电需要5V的电源,主芯片需要3.3V及1.2V的电源。所以在电源模块的设计中需要用到外部供电电源为15V的可移动电源,可以是蓄电池也可以是干电池串联而得。5V的电源通过对15V电源降压而得到,3.3V电源分别由XC6206P332MR通过不

5、同的外围电路来获得。2.1.2 主芯片模块主芯片在此设计中制定为stm32f030作为主控芯片,stm32f030主控芯片的外围电路包括复位电路,晶振,过芯片中的USB接口烧录到SPI FLASH中,选择的启动方式是USB启动。当程序烧录好以后,将启动方式转换为SPI FLASH启动。SDRAM中用于存放程序。STM32F030 内部有RC振荡器,可以为内部的锁相环提供时钟,但同外部晶振相比不够准确,所以本文使用外部时钟源。外部时钟源主要分为高速外部振荡器和低速外部振荡器,高速外部振荡器主要作为芯片处理器和STM32 外设的驱动时钟,低速外部振荡器用于驱动窗口看门狗和实时时钟。该系统采用 8M

6、外部晶振作为高速外部时钟信号的时钟源,外接两个20p F的贴片电容。低速外部振荡器是时钟源可以使用外部晶振或用户自己提供,该系统采用频率值为 32.768k Hz 的外部晶振,外接两个10p F的贴片电容。STM32F030有3种启动方式,分为系统复位、电源复位、备份区域复位。该系统采用电源复位,NRST 引脚与10K电阻串联使引脚处于高电位,当需要复位时,S1开关闭合使 NRST引脚接地,产生低电平使微处理器复位。该微处理器内部也有复位电路,当引脚电压小于 2.0V,片会处于复位状态,但会有 40m A的延迟。 图2.12.1.3 WIFI模块WIFI模块的作用是实现下位机与上位机的实时通信

7、,并且向上位机传递图像数据。使用的是HC05模块。其特性如下: 1、嵌入高性能32位RISC微处理器 2、55nm CMOS 高度集成射频技术 3、集成高性能开关稳压器 4、低功耗 5、支持1/2/3/4/线 PTA WIFI/蓝牙 6、自动校准 7、天线分集 8、控制每个包的功率 9、完全遵守USB v 2.0 高速模式 10、直接支持WIFI功能 11、支持802.1w保护管理框架图2.22.1.4 霍尔传感器模块霍尔传感器是根据霍尔效应制作的一种磁场传感器。霍尔效应是磁电效应的一种,这一现象是霍尔(A.H.Hall,1

8、8551938)于1879年在研究金属的导电机构时发现的。后来发现半导体、导电流体等也有这种效应,而半导体的霍尔效应比金属强得多,利用这现象制成的各种霍尔元件,广泛地应用于工业自动化技术、检测技术及信息处理等方面。霍尔效应是研究半导体材料性能的基本方法。通过霍尔效应实验测定的霍尔系数,能够判断半导体材料的导电类型、载流子浓度及载流子迁移率等重要参数。由霍尔效应的原理知,霍尔电势的大小取决于:Rh为霍尔常数,它与半导体材质有关;I为霍尔元件的偏置电流;B为磁场强度;d为半导体材料的厚度。对于一个给定的霍尔器件,当偏置电流 I 固定时,UH将完全取决于被测的磁场强度B。一个霍尔元件一般有四个引出端

9、子,其中两根是霍尔元件的偏置电流 I 的输入端,另两根是霍尔电压的输出端。如果两输出端构成外回路,就会产生霍尔电流。一般地说,偏置电流的设定通常由外部的基准电压源给出;若精度要求高,则基准电压源均用恒流源取代。为了达到高的灵敏度,有的霍尔元件的传感面上装有高导磁系数的镀膜合金;这类传感器的霍尔电势较大,但在0.05T左右出现饱和,仅适用在低量限、小量程下使用。在半导体薄片两端通以控制电流I,并在薄片的垂直方向施加磁感应强度为B的匀强磁场,则在垂直于电流和磁场的方向上,将产生电势差为UH的霍尔电压。图2.2 霍尔效应2.1.5 开关磁阻电机开关磁阻电动机,调速系统所用的开关磁阻电动机(SRM)是

10、SRD中实现机电能量转换的部件,也是SRD有别于其他电动机驱动系统的主要标志。SRM系双凸极可变磁阻电动机,其定、转子的凸极均由普通硅钢片叠压而成。转子既无绕组也无永磁体,定子极上绕有集中绕组,径向相对的两个绕组联接起来,称为“一相”,SR电动机可以设计成多种不同相数结构,且定、转子的极数有多种不同的搭配。相数多、步距角小,有利于减少转矩脉动,但结构复杂,且主开关器件多,成本高,现今应用较多的是四相(8/6)结构和三相(12/8)结构。图2.2示出四相(8/6)结构SR电动机原理图。为简单计,图中只画出A相绕组及其供电电路。SR电动机的运行原理遵循“磁阻最小原理” 磁通总要沿着磁阻最小的路径闭

11、合,而具有一定形状的铁心在移动到最小磁阻位置时,必使自己的主轴线与磁场的轴线重合。图2中,当定子D-D极励磁时,1-1'向定子轴线D-D'重合的位置转动,并使D相励磁绕组的电感最大。若以图中定、转子所处的相对位置作为起始位置,则依次给DABC相绕组通电,转子即会逆着励磁顺序以逆时针方向连续旋转;反之,若依次给BADC相通电,则电动机即会沿顺时针方向转动。可见,SR电动机的转向与相绕组的电流方向无关,而仅取决于相绕组通电的顺序。另外,从图2.2可以看出,当主开关器件S1、S2导通时,A相绕组从直流电源US吸收电能,而当S1、S2关断时,绕组电流经续流二极管VD1、VD2继续流通,

12、并回馈给电源US。因此,SR电动机传动的共性特点是具有再生作用,系统效率高。 图 2.32.1.6 电路板抗干扰设计 电路设计和应用应尽量消除或抑制电子电路的干扰,该监测系统的硬件电路用来接收传感器的数据并对其进行处理,如果不能降低各类干扰的影响,将会增加监测数据误差。硬件电路设计过程中充分考虑对干扰的抑制,对电路进行了合理的设计以及选择合适的元器件。在硬件电路设计过程中,充分从抑制干扰源、切断干扰途径以及提高元器件的抗干扰性能等三方面考虑,为降低信号干扰,采取了以下措施。 (1)以核心部件为中心,围绕其进行布线,易受干扰元器件相互远离,输入输出元器件分开放置,电源和高频电路部分尽量远离; (

13、2)STM32微处理器和大功率器件的地线需要单独接地,以减少相互干扰,大功率元器件放置在电路板边缘; (3)在电路板布线时避免九十度折线,同时减少回路环面积,选择合适粗细的地线以及电源线; (4)数字区和模拟区用地线隔离,模拟地和数字地要分离,统一在一点接于电源地。1.2 软件设计方案 软件系统框图如下:软件系统框图 2.42 手机客户端APP设计2.1 开发环境的搭建 本设计在开发过程中使用Eclipse加ADT插件的开发环境,Eclipse集成开发环境JDK,首先需要安装JDK工具包,本设计中使用的JDK版本是JDK7Windowsi586exe。安装完成后,配置系统环境变量,将JDK的安

14、装路径添加到系统Path中去。在Andriod developer官网上下载Eclipse开发环境,其己对Eclipse和ADK插件绑定,开发者直接下载后解压即可使用。本设计使用的版本是adtbundlewindowsx8620140702zip。2.2 手机APP的主要功能模块 手机APP的设计采用了MVC框架,将Model、View和Controler分开,有效减少开发工作量量和有效减少开发工作查和代码冗余率,有利于代码调试。本设计将手机端功能主要分为5大功能模块:登录功能模块、查询功能模块、接收数据模块、蓝牙验证模块。(1)登录模块登录模块需要用户输入个人信息,如用户名、密码、手机号码等

15、。登录界面设计两个EditView输入烂和2个Button,输入烂用来接收用户名,2个按紐分别是登录和取消。当用户点击确认按钮后,跳转到主页面。confirm=(ImageButton)findViewById(R.id.confirm);(确认按钮绑定) cancel=(ImageButton)findViewById(R.id.cancel); (取消按钮绑定) public void onClick(View v) (设定按钮点击事件)switch (v.getId() case R.id.confirm:username=name.getText().toString();if(use

16、rname.equals("")Toast.makeText(LoginActivity.this, "用户名为空,请输入!", Toast.LENGTH_SHORT).show();elseIntent intent = new Intent(); intent.setClass(LoginActivity.this, MainActivity.class); intent.putExtra("name", username); startActivity(intent);break; case R.id.cancel:this.f

17、inish();break;default:break;(2)蓝牙搜索模块 进入搜索蓝牙界面后,会搜索附近的蓝牙a.设置权限 在manifest中配置 <uses-permission android:name="android.permission.BLUETOOTH"/>  <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>b.启动蓝牙 首先要查看本机是否支持蓝牙,获取Bl

18、uetoothAdapter蓝牙适配器对象 BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();  if(mBluetoothAdapter = null)  /表明此手机不支持蓝牙          return;    if(!mBluetoothAdapter.isE

19、nabled() /蓝牙未开启,则开启蓝牙    Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);    startActivityForResult(enableIntent, REQUEST_ENABLE_BT);     public void onActivityResult(int

20、 requestCode, int resultCode, Intent data)    if(requestCode = REQUEST_ENABLE_BT)      if(requestCode = RESULT_OK) /蓝牙已经开启             

21、                 c.发现蓝牙设备 这里可以细分为几个方面  (I)使本机蓝牙处于可见(即处于易被搜索到状态),便于其他设备发现本机蓝牙 /使本机蓝牙在300秒内可被搜索  private void ensureDiscoverable()    if (mBluetoothAdapter.g

22、etScanMode() !=    BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE)     Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);    discoverableIntent.putExtra(BluetoothAdapter.

23、EXTRA_DISCOVERABLE_DURATION, 300);    startActivity(discoverableIntent);      (II)查找已经配对的蓝牙设备,即以前已经配对过的设备 Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();  if (pairedDevices.size

24、() > 0)    findViewById(R.id.title_paired_devices).setVisibility(View.VISIBLE);  for (BluetoothDevice device : pairedDevices)           /device.getName() +" "+

25、60;device.getAddress();     else     mPairedDevicesArrayAdapter.add("没有找到已匹对的设备");    (III)通过mBluetoothAdapter.startDiscovery();搜索设备,要获得此搜索的结果需要注册 一个BroadcastReceiver来获取。先注册再获取信息,然后处理/注册,当一个设备被发现时调用onReceiveIntentFi

26、lter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);this.registerReceiver(mReceiver, filter);/当搜索结束后调用onReceivefilter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);   this.registerReceiver(mReceiver, filter); 

27、 private BroadcastReceiver mReceiver = new BroadcastReceiver() Override   public void onReceive(Context context, Intent intent)      String action = intent.getAction();  

28、   if(BluetoothDevice.ACTION_FOUND.equals(action)        BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);  / 已经配对的则跳过     if (device.getBondState() 

29、;!= BluetoothDevice.BOND_BONDED)       mNewDevicesArrayAdapter.add(device.getName() + "n" + device.getAddress();  /保存设备地址与名字                

30、                 else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)   /搜索结束      if (mNewDevicesArrayAdapter.getCount() = 0) 

31、0;      mNewDevicesArrayAdapter.add("没有搜索到设备");                               d.建立连接 查找到设备 后,则需要建立本机与其他设备之间的连接

32、。一般用本机搜索其他蓝牙设备时,本机可以作为一个服务端,接收其他设备的连接。启动一个服务器端的线程,死循环等待客户端的连接,这与ServerSocket极为相似。 这个线程在准备连接之前启动 /UUID可以看做一个端口号  private static final UUID MY_UUID =    UUID.fromString("fa87c0d0-afac-11de-8a39-0800200c9a66");   

33、  /像一个服务器一样时刻监听是否有连接建立    private class AcceptThread extends Thread     private BluetoothServerSocket serverSocket;         public AcceptThread(boolean secure)&

34、#160;      BluetoothServerSocket temp = null;              try     temp = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(    

35、;NAME_INSECURE, MY_UUID);        catch (IOException e)         Log.e("app", "listen() failed", e);           &

36、#160;                serverSocket = temp;              public void run()    BluetoothSocket socket=null;&

37、#160;   while(true)    try     socket = serverSocket.accept();        catch (IOException e)     Log.e("app", "accept() failed"

38、;, e);    break;            if(socket!=null) /此时可以新建一个数据交换线程,把此socket传进去                        

39、;     /取消监听     public void cancel()        try      serverSocket.close();      catch (IOException e)     

40、; Log.e("app", "Socket Type" + socketType + "close() of server failed", e);                       &#

41、160;    e.建立数据通信线程,进行读取数据 /建立连接后,进行数据通信的线程   private class ConnectedThread extends Thread    private BluetoothSocket socket;    private InputStream inStream;    

42、;private OutputStream outStream;            public ConnectedThread(BluetoothSocket socket)         this.socket = socket;       try

43、  /获得输入输出流        inStream = socket.getInputStream();        outStream = socket.getOutputStream();          catch (IOException e) 

44、          Log.e("app", "temp sockets not created", e);                         &

45、#160;     public void run()      byte buff = new byte1024;      int len=0;/读数据需不断监听,写不需要      while(true)       try

46、         len = inStream.read(buff);        /把读取到的数据发送给UI进行显示        Message msg = handler.obtainMessage(BluetoothChat.MESSAGE_READ,len, -1, 

47、buff);        msg.sendToTarget();         catch (IOException e)         Log.e("app", "disconnected", e);    &#

48、160;   connectionLost();   /失去连接        start();    /重新启动服务器        break;                

49、                public void write(byte buffer)      try       outStream.write(buffer);  / Share the sent messa

50、ge back to the UI Activity       handler.obtainMessage(BluetoothChat.MESSAGE_WRITE, -1, -1, buffer).sendToTarget();        catch (IOException e)     &

51、#160;  Log.e("app", "Exception during write", e);                          public void cancel()  

52、60;   try        socket.close();        catch (IOException e)        Log.e("app", "close() of connect socket failed

53、", e);                     (3)数据查询 query=(ImageButton)findViewById(R.id.query); query.setOnClickListener(this); listview = (ListView) findViewById(R.id.listView); db=new DataBaseCreat(M

54、ainActivity.this); db.open(); begin_date=(EditText)findViewById(R.id.begin_date); end_date=(EditText)findViewById(R.id.end_date); yue=(Button)findViewById(R.id.yue); zhou=(Button)findViewById(R.id.zhou); ri=(Button)findViewById(R.id.ri); yue.setOnClickListener(new OnClickListener() Overridepublic vo

55、id onClick(View v) / TODO Auto-generated method stubQUERY_METHOD=0;); zhou.setOnClickListener(new OnClickListener() Overridepublic void onClick(View v) / TODO Auto-generated method stubQUERY_METHOD=1;); ri.setOnClickListener(new OnClickListener() Override public void onClick(View v) / TODO Auto-gene

56、rated method stub QUERY_METHOD=2; );Overridepublic void onClick(View v) / TODO Auto-generated method stubswitch (v.getId() case R.id.query:if(TextUtils.isEmpty(begin_date.getText() | TextUtils.isEmpty(end_date.getText() Toast.makeText(MainActivity.this, "输入时间为空,请检查", Toast.LENGTH_SHORT).sh

57、ow(); break;Toast.makeText(MainActivity.this, "查询中,请稍后", Toast.LENGTH_SHORT).show();ArrayList<HashMap<String, Object>> temp = new ArrayList<HashMap<String,Object>>();temp=db.getAllContact(QUERY_METHOD,name,datebegin, dateend);SimpleAdapter myAdapter = null;switch (QUERY_METHOD) case 0: myAdapter = new SimpleAdapter(this,temp,R.layout.item0,new String"user_name","year", "month&

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论