manhuami2007

  • 2019-02-14
  • 发表了主题帖: 普通二极管与齐纳二极管的区别

    二极管是电路设计的常见器件,但是二极管又有多个种类,比如普通二极管、齐纳二极管、肖特基二极管等等。那么这些二极管有什么区别,适用于哪些场合?
    应用特性普通二极管利用的是二极管单向导通的特性,因此常应用在正向偏置的场合。齐纳二极管则是利用二极管的反向击穿区,因此工作在反向偏置时。应用场合普通二极管用在:整流电路限幅电路钳位电路 齐纳二极管用在:稳压电路 肖特基二极管与普通二极管的区别肖特基二极管相对于普通二极管的优点:开关频率高正向压降低 缺点:反向偏压低反向漏电流大 此内容由EEWORLD论坛网友manhuami2007原创,如需转载或用于商业用途需征得作者同意并注明出处 [size=0em]​

  • 发表了日志: 普通二极管与齐纳二极管的区别

  • 2019-02-08
  • 发表了主题帖: 如何设计最小系统?

    在做电路板设计的时候,我们通常是由一个MCU的最小系统开始的。那么一个最小系统应该包含哪些部分呢?有哪些注意事项?
    一个最小系统应该包括以下几个部分才能够正常的使用: 电源、复位电路、时钟、BOOT电路、调试接口、固件下载接口 电源 电源应分为两部分考虑,输入部分和输出部分。 输入部分就是引入最小系统的电源,输出部分为接入MCU的电源。 输入部分需要考虑 硬件接口类型,如使用USB接口输入的电压值 输出部分需要考虑 MCU需要的电源类型,根据功能对电源电路进行合并或裁剪。确定每路电源对应的去耦电容的容值 首先我们要知道MCU需要的电源类型,通常包括:模拟电源、数字电源、MCU内部调压器、备份电源等。 但是对应不同的功能,有些电源是不需要单独提供的,因此接下来需要对电源电路进行合并与裁剪。比如不需要备份功能的设计,可以使用数字电源代替备份电源,不使用MCU的ADC和DAC功能的,可以将数字电源与模拟电源合并。 复位电路 是否需要复位按键是否需要在外部连接电容或者电阻 时钟 是否需要外接晶振确定外接晶振的频率值 对一些MCU,其内部包含低精度的晶振,当电路对时间精度要求不高的时候,可以不使用外部晶振。 BOOT方式 确定BOOT引脚的外部电路 调试接口 调试的方式很多,比如JTAG接口、SWD接口,或者使用串口打印调试信息。 固件下载接口 确定使用哪种接口下载固件,比如使用串口下载,也可以使用调试接口下载。 此内容由EEWORLD论坛网友manhuami2007原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 发表了日志: 如何设计最小系统?

  • 2019-01-20
  • 发表了主题帖: 【NXP Rapid IoT评测】+ Rapid IOT套件测评总结

    评测的结束日期到了,是时候总结一下这次的评测了。首先说下这个套件的优缺点,然后总结一下开发过程以及评测结束后的遗憾。 套件的优点: 这个套件的确挺惊艳的,不像是个开发板,更接近于产品。提供的功能众多,可玩性很高。提供双MCU,高端+低端,而且这两个MCU都支持开发带LCD屏,能够学习GUI的开发蓝牙+Thread ,能够学习通讯协议的开发。尤其是这次测评,学到了很多蓝牙BLE的开发知识。MCU使用的外设丰富,几乎涵盖了所有的外设,更方便我们学习这次测评大多使用的离线IDE开发,因此看到了很多优秀的源代码,收获很大,比如定时函数+状态机这种代码结构,用起来挺方便的。而我以前都是在滴答中断中加入使能/禁止变量实现的,代码比较复杂。还学到了FSCI这种通讯框架,还有emWin的使用等等。 套件的缺点: 在线的IDE经常打不开蓝牙编程的入门的文档不够入门 -_-||没有程序的下载与调试口(这个不能要求太多,毕竟这个套件已经很划算了)个人感觉其代码结构不够清晰,而且注释较少,想知道代码怎么运行很费劲不支持wifi 开发过程总结: 前期的开发过程挺流畅的。由于使用的离线IDE,其提供的示例代码中涵盖了大部分功能。在传感器的使用那里没有遇到障碍,很快就完成了。接着是操作系统层,NXP使用的是FreeRTOS,但是NXP在这个操作系统外又抽象出一层,这样方便以后更换操作系统。之后是GUI,使用的是emWin,因为没有使用复杂的显示功能,只是字符串的显示,所以也没有难度。然后进入到蓝牙的开发,这个比较头疼,大部分时间都卡在这块。这里要说的一个教训是:当不了解蓝牙怎么编程时,不要试图通过看代码搞懂,也不能靠网上搜索的内容,还是需要买本入门的蓝牙书籍。因为书籍的介绍更系统,能够让我们了解蓝牙的工作流程、架构以及一些专有名词。然后就是蓝牙和以太网的网关设计。我使用的是python语言,在笔记本上搭建的,使用简单(主要是我不会安卓的开发..)。最后就是web功能的实现,这个就是在网上找一些免费的第三方服务了。 遗憾: 时间比较仓促,很多功能没有测试,比如GUI的进阶开发,FSCI的源代码结构,MKW41Z的源代码也没有看,等等。由于没有其他支持Thread通讯的外设,所以没有学到Thread怎么用 最后要说的是很感谢EEWORLD和NXP提供的这次机会,真的收货很大。 以下是发表的评测帖 上手的第一个帖子,使用online ide实现GUI的显示 如何使用离线IDE开发 emWin的GUI使用 使用离线IDE获取各传感器数据 使用示例代码中的蓝牙例程 使用电脑的蓝牙与套件通讯,获取传感器数据 使用电脑的蓝牙向套件写入数据 使用电脑转发套件的数据,实现数据的web访问 套件蓝牙协议栈的结构与使用方法 远程修改套件屏幕的显示数据 此内容由EEWORLD论坛网友manhuami2007原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 发表了主题帖: 【NXP Rapid IoT评测】+ 远程修改显示屏数据

    本来应该完成的是使用web服务修改屏幕的显示,但是没有找到合适的服务器去构架MQTT服务。所以就退而求其次,只是通过蓝牙修改屏幕数据。毕竟网络服务是建立在手机或者电脑上的,和套件没有关系。 参考我写的另外两个帖子,分别是蓝牙接收数据,已经电脑上构建蓝牙服务的帖子。 套件使用蓝牙接收数据 电脑端构建蓝牙服务 电脑端的代码为 import asyncio from bleak import discover from bleak import BleakClient class My_Bluetooth():     def __init__(self,name):         self.devices = None         self.loop = asyncio.get_event_loop()         self.name = name     async def find_devices(self):         self.devices = await discover()     def scan_devices(self):         print("Find devices..")         self.loop.run_until_complete(self.find_devices())     def get_device_addr(self):         for d in self.devices:             if d.name == self.name:                 self.addr = d.address     def connect_device(self):         print("Try to connect "+self.addr+" ...")         self.client = BleakClient(self.addr,self.loop)         self.loop.run_until_complete(self.client.connect())     async def get_services(self):         self.svcs = await self.client.get_services()              def print_services(self):         self.loop.run_until_complete(self.get_services())     async def write_data(self,show_string):         STRING_UUID = "0ab5b693-c2ce-c4ab-e711-6ccbaa65c888"         if len(show_string) != 0:             await self.client.write_gatt_char(STRING_UUID,show_string)                  def write_something(self,show_string):         loop = asyncio.get_event_loop()         loop.run_until_complete(self.write_data(show_string)) print("Start..") BT = My_Bluetooth("RPK-AF90") BT.scan_devices() BT.get_device_addr() BT.connect_device() BT.print_services() while True:     buffer = input("Enter the string:")        buffer = bytes(buffer,encoding='utf-8') + b'\x00'     BT.write_something(buffer)复制代码 在电脑端,仍然是python+bleak实现修改蓝牙特性值的操作。当套件接收到修改特性值的操作后,会触发事件,套件根据事件来实现相关的操作。更新屏幕的数据显示就是放在这个事件处理函数中的。 此内容由EEWORLD论坛网友manhuami2007原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 发表了主题帖: 【NXP Rapid IoT评测】+ 蓝牙协议栈使用方法小结

    本帖最后由 manhuami2007 于 2019-1-20 20:15 编辑 Rapid iot套件是如何使用蓝牙进行通讯的呢?通过在MK64FN这颗主MCU中模拟出蓝牙协议栈来进行蓝牙通讯。 那么是如何模拟的呢? 我们知道这个套件是双MCU的,MKW41Z负责蓝牙,MK64FN则是主MCU。通常我们编写的代码都是MK64FN的代码。这两个MCU使用FSCI(Framework Serial Communication Interface)互相通讯。这个FSCI是一个串行通讯的协议框架。这两个MCU间通讯不是简单的数据透传,而是通过串口命令在MK64FN芯片上模拟出蓝牙协议栈。也就是说不同的串口命令,对应着协议栈中GAP、GATT等协议的不同操作,我们想要执行协议中的那个操作,MK64FN就要向MKW41Z发送对应的命令。这样也就相当于在MK64FN上实现了蓝牙的协议栈。 在BLE的通讯中,我们的套件是服务器,电脑或者手机是客户端,这是因为数据都在套件上,是套件在提供服务。但是从通讯的角度看,电脑或者手机却是主机,而套件是从机。这两个概念需要搞清楚。 数据的组织形式是服务和特性。我们可以依据不同的传感器类型建立不同的服务,然后再在服务下建立多个特性。比如说我们以电池的数据建立1个服务,而电池有多种数据,比如是否充电、电量是多少。根据这两个数据,我们能够在电池的服务下再建立2个特性。 我们的提供的数据对于蓝牙就是不同的服务以及服务中不同的特性。那么这些服务又是如何添加到程序中的呢? 在蓝牙栈中,有两个方式来添加服务和特性。静态添加服务和动态添加服务。这就类似于变量,静态变量和动态申请的变量。由于我们的代码是在MK64FN中的,它独立于MKW41Z,因此服务和特性只能等MKW41Z启动之后动态的进行添加。 添加了服务和特性之后做什么? 之后套件开始广播,使得主机能够发现套机的蓝牙。当主机发现套件后就要向套件发起连接请求,这时候套件就要响应连接请求。 那么蓝牙的数据是何时写入和读出的呢? 首先说套件提供的蓝牙数据是当蓝牙连接建立之后,会有1个定时函数,定时的读取各传感器的参数,然后写入蓝牙服务的特性中。 而我们在手机或者电脑上写入数据后,会触发1个事件GATTServer-AttributeWritten,当收到这个事件之后,套件回去读取写入的数据是什么。 此内容由EEWORLD论坛网友manhuami2007原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 2019-01-16
  • 发表了主题帖: 【NXP Rapid IoT评测】+ web 获得rapid iot套件的数据

    这个是第4周安排的第一个项目,使用web获得 rapid iot套件的数据。 实现方式:使用电脑的蓝牙连接rapid iot 套件,使用python+bleak实现蓝牙数据的传输,以及web的交互。使用的云服务器是 dweet.io 。 dweet.io是一个免费的云服务器网站。显示界面如下图。 这个云服务器使用方法很简单,在我们上传数据时需要一个id号,然后我们想访问数据时只需要输入网址 dweet.io/follow/id ,把url最后的id替换成自己的id就可以了,大家也可以看我的设备数据,访问dweet.io/follow/manhuami2007 即可。而且这个网站有一个对应的python库dweepy,能够更方便的访问。 下面的附件为套件的bin文件,python的源码(使用的python版本需要是python3.6)。 使用电脑跟蓝牙通讯时,需要先在电脑上绑定rapid iot套件。也就是在电脑蓝牙的设置页面先连接一次蓝牙。 此内容由EEWORLD论坛网友manhuami2007原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 发表了主题帖: 【NXP Rapid IoT评测】+ 蓝牙操作 (3 接收数据)

    前几个帖子说了怎么使用蓝牙将数据传输出去,这篇帖子说说怎么接收数据。 首先需要大概说下蓝牙协议栈的结构。BLE设备中的数据是以 Service 分组,每个Server中可以包含若干个Characteristic 。我们的数据就是每个Characteristic中的值。主机通过向Characteristic 中写数据,实现了蓝牙数据的接收。 那么在例程中如何接收数据,并对数据做处理呢? 在ble_shell.c 的 void BleApp_DemoRpkWriteCallback(void *data) 函数中,实现对接收到的数据的处理。比如我们想把接收到的数据显示在屏幕上,那么就要在对应的Characteristic里添加函数。代码如下: else if (rcvData->AttributeWrittenEvent.Handle == hValueString)     {             if (rcvData->AttributeWrittenEvent.ValueLength >= 1){                     GUI_Clear();                     GUI_DispStringAt((char *)rcvData->AttributeWrittenEvent.Value,0,0);             }else{                     status = 0xd;             }     }复制代码 当我们对应的Characteristic接收到数据之后,就会调用BleApp_DemoRpkWriteCallback()回调函数,然后通过判断句柄AttributeWrittenEvent.Handle ,确定进入哪个处理函数中。 此内容由EEWORLD论坛网友manhuami2007原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 2019-01-14
  • 发表了主题帖: 【NXP Rapid IoT评测】+ 蓝牙(2 使用电脑的蓝牙连接)

    Rapid iot 套件只有蓝牙和Thread,那么如何使用Rapid iot 套件实现物联网技术?这需要借助网关,将其数据转发到互联网上。在online ide中,使用的网关是手机。不过使用手机当网关的应用还是少数。使用PC端或者树莓派这样的设备当网关可能更实用。因此选择使用笔记本的蓝牙来实现网关功能。 使用的编程语言是python3,使用的库是bleak。使用这个库能够实现蓝牙BLE的连接与通讯。 现在实现了读取套件的数据的功能。 下面是python的代码 import asyncio from bleak import discover from bleak import BleakClient import time class My_Bluetooth():     def __init__(self,name):         self.devices = None         self.loop = asyncio.get_event_loop()         self.name = name     async def find_devices(self):         self.devices = await discover()     def scan_devices(self):         print("Find devices..")         self.loop.run_until_complete(self.find_devices())     def get_device_addr(self):         for d in self.devices:             if d.name == self.name:                 self.addr = d.address     def connect_device(self):         print("Try to connect "+self.addr+" ...")         self.client = BleakClient(self.addr,self.loop)         self.loop.run_until_complete(self.client.connect())         ##print(self.client.is_connected())     async def get_services(self):         self.svcs = await self.client.get_services()              def print_services(self):         self.loop.run_until_complete(self.get_services())         print("Services:", self.svcs)              async def read_battery(self):         BATTERY_UUID = "00002a19-0000-1000-8000-00805f9b34fb"         self.value = await self.client.read_gatt_char(BATTERY_UUID)     def print_battery_value(self):         self.loop.run_until_complete(self.read_battery())         print(int(self.value.hex(),16)) print("Start..") BT = My_Bluetooth("RPK-AF90") BT.scan_devices() BT.get_device_addr() BT.connect_device() BT.print_services() while True:     BT.print_battery_value()     time.sleep(5)复制代码 实现的效果是每5秒显示一下电量。 此内容由EEWORLD论坛网友manhuami2007原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 2019-01-10
  • 回复了主题帖: 【NXP Rapid IoT评测】+ 使用离线IDE构建显示传感器信息的应用

    bjemt 发表于 2019-1-10 14:39 请问一下:您用的IDE是MCUXpresso IDE吗?NXP给的SDK可以使用web IDE中的那些组件吗?使用MCUXpresso IDE可 ...
    纠正一下,我刚才好像理解错你最后一个问题的意思了。我也不知道能不能封装成web ide的组件。我一开始理解的意思是,封装成能够在离线IDE中使用的组件。

  • 发表了主题帖: 【NXP Rapid IoT评测】+ 蓝牙的使用(1 初探)

    这一周都在弄Rapid IOT套件的蓝牙,快被搞疯了。一开始以为蓝牙就像串口一样,是我想的太简单了。蓝牙的协议栈挺复杂的。现在还没有弄清楚跟手机连接的具体流程,但是在其DEMO中有一个例程,可以学习。 在ble_shell.c的文件中,函数void BleApp_DemoRpk(void) 是一个例程。包括了与手机配对,然后提供数据服务的整体代码。各位想学习的,可以研究研究。等我弄明白了,我再写一篇比较详细的例程。 此内容由EEWORLD论坛网友manhuami2007原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 回复了主题帖: 【NXP Rapid IoT评测】+ 使用离线IDE构建显示传感器信息的应用

    bjemt 发表于 2019-1-10 14:39 请问一下:您用的IDE是MCUXpresso IDE吗?NXP给的SDK可以使用web IDE中的那些组件吗?使用MCUXpresso IDE可 ...
    1、用的是MCUXpresso IDE 2、web ide是提供下载工程代码的,你可以把web ide写好的程序的源代码下载下来使用,这样你就可以使用其中的组件了 3、当然可以

  • 2019-01-09
  • 回复了主题帖: 【NXP Rapid IoT评测】+ 使用离线IDE构建显示传感器信息的应用

    0731tao 发表于 2019-1-5 15:36 感兴趣、可以商用吗?
    可以商用,就是成本有点高

  • 2019-01-02
  • 回复了主题帖: 【NXP Rapid IoT评测】+ 使用离线IDE构建显示传感器信息的应用

    littleshrimp 发表于 2019-1-2 18:01 电池供电能用多长时间
    这个没有试过,时间挺短的

  • 回复了主题帖: 【NXP Rapid IoT评测】+ 使用离线IDE构建显示传感器信息的应用

    下一步准备研究下离线IDE的蓝牙怎么用。这个模块是不支持wifi的,我也是晕,没有看清楚。模块支持的是Thread 802.15.4,而wifi是802.11。看来只能连接手机的蓝牙,然后再通过手机的wifi联网了。

  • 发表了主题帖: 【NXP Rapid IoT评测】+ 使用离线IDE构建显示传感器信息的应用

    使用离线的IDE开发能够更灵活。本次实现了温湿度、光强、空气质量、电量和充电状态的采集,并通过屏幕显示出来。 在提供的模板例程中使用了操作系统。操作系统使用的是Freertos,但是其在rtos上又构建了一个抽象层。其入口是在void main_task(uint32_t param)复制代码这个函数中。因此我也在这函数中新建了两个任务,获取数据的任务与显示任务。OSA_TASK_DEFINE(get_data_task, OSA_PRIORITY_NORMAL, 1, 1600, 0)  ; OSA_TASK_DEFINE(display_task, OSA_PRIORITY_LOW, 1, 1600, 0)  ;复制代码 获取数据的任务是没100ms获取一次各数据。代码没有进行优化,写的有点乱,大家先参考一下。 获取温湿度的代码: void get_temp_and_humity(int32_t *temp, int32_t *humity) {         ens210_meas_data_t data;         ENS210_Measure(mode_TH,&data);         *temp = data.T_Celsius;         *humity = data.H_Percent; }复制代码 获取空气质量,也就是获取CO2浓度的代码: void get_co2(int32_t *air) {         uint8_t ready;         uint16_t uCO2;         CCS811_dataAvailable(&ready);         if (ready == 1) {             CCS811_readAlgorithmResults();             uCO2 = CCS811_getCO2();             *air = uCO2;         } }复制代码 获取光强: void get_light(int32_t *light) {         float temp_light = 0;         TSL2572_ReadAmbientLight(&temp_light);         TSL2572_ClearALSInterrupt();         *light = (int32_t) temp_light; }复制代码 获取电量百分比与充电状态: void get_battery(int32_t *power_state,char *charge_state_string) {         uint8_t bat_level,bat_state;         BatterySensor_GetState(&bat_level, &bat_state);         if(bat_state == 0){                 sprintf(charge_state_string,"    ");         }else{                 sprintf(charge_state_string,"!   ");         }         *power_state = bat_level; }复制代码 获取数据任务的代码: void get_data_task(uint32_t param) {         while(1){                 get_temp_and_humity(&temp,&humity);                 get_light(&light);                 get_co2(&air);                 get_battery(&power,charge_state);                 OSA_TimeDelay(100);         } }复制代码 显示任务的代码: int32_t temp,humity,light,air,power; char charge_state[10]; void display_task(uint32_t param) {         char dis_string[20];         while(1){                 //GUI_Clear();                 GUI_GotoXY(0,0);                 GUI_DispString("temperature is: \n");                 sprintf(dis_string,"    %d    \n",temp);                 GUI_DispString(dis_string);                 GUI_DispString("humity is: \n");                 sprintf(dis_string,"    %d    \n",humity);                 GUI_DispString(dis_string);                 GUI_DispString("light is: \n");                 sprintf(dis_string,"    %d    \n",light);                 GUI_DispString(dis_string);                 GUI_DispString("air is: \n");                 sprintf(dis_string,"    %d    \n",air);                 GUI_DispString(dis_string);                 GUI_DispString("power is: \n");                 sprintf(dis_string,"    % 3d, %s\n",power,charge_state);                 GUI_DispString(dis_string);                 OSA_TimeDelay(100);         } }复制代码 此内容由EEWORLD论坛网友manhuami2007原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 2018-12-31
  • 发表了主题帖: 【NXP Rapid IoT评测】+ GUI的使用

    本帖最后由 manhuami2007 于 2018-12-31 21:23 编辑 在SDK的Hello world例程的GUI使用的是emWin5.42,emWin5.42的中文手册见附件。在GUIConf.h中,将GUI配置成单任务启动。在入门手册中有一段简单的GUI代码,我们就以这段代码大致讲一下GUI的使用。     GUI_SetFont(&GUI_Font8x18); //设置字体为8*18     GUI_SetBkColor(GUI_DARKBLUE); //设置背景色为GUI_DARKBLUE     GUI_Clear(); //清屏     GUI_SetColor(GUI_RED); //设置前景色为GUI_RED     GUI_DispString("\n    Rapid Iot\n\n"); //显示字符串     GUI_DispString("    Hello EEworld\n\n");复制代码 我们在使用GUI的时候也要注意,尽量只有1个任务去调用GUI的函数。 此内容由EEWORLD论坛网友manhuami2007原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 2018-12-30
  • 发表了主题帖: 【NXP Rapid IoT评测】+ 使用IDE开始第一个程序

    本帖最后由 manhuami2007 于 2018-12-30 11:43 编辑 使用IDE开始编程的步骤: 下载IDE下载SDK,并引入IDE中由SDK中的模板程序开始编程编译代码生成bin文件并下载到目标板上 前4步在入门文档(Rapid IoT Prototyping Tool User's Guide)中的第4.3节(138页开始)都解释的很清楚,不过有1个注意事项见下图,要勾掉红框中的2个复选框,否则编译的时候会出错。 第5步,就是最后一步,生成bin文件并下载到目标板上。由于我们没有底板,因此无法使用调试等功能,只能将生成的bin文件复制到目标板上才能完成烧写。 生成bin文件的方法见下图,这时bin文件就出现在了"..\workspace\rapid_iot_k64f_hello_world\Debug"这个文件夹中 最后同时按下SW3+SW5重启目标板,然后将bin文件放到产生的U盘中,等待烧写结束。 此内容由EEWORLD论坛网友manhuami2007原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 2018-12-28
  • 回复了主题帖: 【NXP Rapid IoT评测】+Hello world!

    cruelfox 发表于 2018-12-27 22:43 这个过程就不需要经过手机APP了?
    不需要的

最近访客

< 1/3 >

统计信息

已有220人来访过

  • 芯币:150
  • 好友:--
  • 主题:25
  • 回复:54
  • 课时:--
  • 资源:1

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言