本帖最后由 电赛小编 于 2019-4-11 17:39 编辑
项目完成了,首先先感谢下物电学院的邹老师,在制作的过程中提供了很多帮助;其次就是小编姐姐了,从年前的项目申请到最终项目的提交中间有很多需要沟通协商的事情,辛苦了。这篇报告分两大块,第一部分是开箱过程,讲解各模块使用芯片方案及相关资料。第二部分就是开发过程了,讲解了使用官方库配置以及MDK环境下程序的编写,并最终封装成驱动库开源给大家,方便大家使用。像寻迹模块、红外遥控模块、电机方向及调速相关部分都完成了,基本上都有注释,但难免有bug个,权当抛砖引玉了,大家一起来完善吧。
开箱过程
| 早上接到顺丰的配送短信,中午去领的,好大一个箱子,期间又签了一个捐赠协议才抱回来。 |
| 快递箱拆开里面共有俩盒子,一个是小车套件的另外一个就是MSP432的开发板了。 |
| 小车套件盒的侧边说明,可以看出这一款是迷宫机器人,比官方的应该是少了距离传感器。 |
| 小车盒子里的全部配件,包装做的比较细致,每个零件袋子上都做了说明,方便后续组装。 |
| launchpad一贯的风格。一个板子 一根数据线 一张卡片 |
Ti-rslk是围绕MSP432P401R LaunchPad构建的。MSP432系列单片机是Ti采用ARM Cortex – M4F 内核生产的新型 32 位处理器。之前使用的M3内核的芯片都不带浮点单元,而MSP432的浮点单元可以处理一些大量运算,如电机闭环控制、PID算法、快速傅里叶变换等。
记得之前Ti有个活动,讲的就是MSP432系列的处理器。因为对以太网感兴趣,关注过E系列,不过Ti-rslk采用的是P系列的LaunchPad,从官网的宣传可以看出的二者的区别。P系列集成了16位的SAR ADC,E系列则集成了以太网控制器(MAC 和 PHY)。
SAR ADC 与 Sigma Delta ADC 的区别感兴趣的可以看这里Ti的工业研讨会视频http://training.eeworld.com.cn/TI/video/9206
电机驱动方案采用TI自家的H桥的DRV8838芯片,该芯片支持11V以下的电机电压,最高可提供1.8A驱动电流,并且提供过流保护、短路保护、欠压闭锁和过热保护的内部关断功能。详细的信息可以下载官方datasheet,官方连接http://www.ti.com.cn/product/cn/DRV8838
传感器比较小,看着比较精致,之前用的都是特别大,因此果断查了下买点屯着。该光学传感器使用的是安森美生产的QRE1113GR反射对象传感器,不过比较惊讶的是对反射数据的处理方式,使用一种不同的方法。之前使用的都是数字量的模块,第一次见这种处理技巧,也算学到了。官网连接在这https://www.onsemi.cn/PowerSolutions/product.do?id=QRE1113GR
红外遥控接收传感器采用的是威世半导体的TSOP34840这款红外传感器,好像这个是ti-rslk新增的模块,之前没见相关资料有介绍红外接收模块的。传感器官网:http://www.vishay.com/product?docid=82489
电源方案采用的是DC-DC方案,用的也是Ti自家的TPS54531降压转换器。该器件是一款 28V、5A 非同步降压转换器,支持过压瞬态保护电路可限制启动和瞬变期间的电压过冲。逐周期电流限制机制、频率折返和热关断特性可在过载条件下对器件和负载施加保护。
http://www.ti.com.cn/product/cn/TPS54531?keyMatch=tps54531&tisearch=Search-CN-Everything
分割线
开发过程
首先说下开发环境,开发环境使用的是Keil MDK5,毕竟使用几年了比较熟悉。再者也是因为MSP432支持MDK了,不会的也没关系,官方为此做了一个文档,讲的还是很详细的。
详细的MDK配置请参看上面的文档,这里补充下文档里没有的部分。LaunchPad自带XDS调试器,上面文档中介绍的可以直接在MDK里选XDS调试器,这里我没找到怎么选,用了另外一种兼容方法,这里说下,供参考。Debug选项卡中找不到XDS调试器,我直接选的CMSIS-DAP,具体见图,可以正常下载调试。
Ti-rslk教程中讲的是使用操作寄存器方法来开发,对于我这个51的寄存器都没记熟的来说不太友好。用惯了M3系列的库,就自己去Ti官网找了驱动库。链接:http://software-dl.ti.com/msp430/msp430_public_sw/mcu/msp430/MSP432_Driver_Library/latest/index_FDS.html 官方库文件包含的东西很多,有些看不懂,有些用不着就提取了一些,修改了头文件的引用目录为后面开发做准备。
文件夹中inc文件夹为所有库文件的头文件,其中的文件引用全部修改了。Linker文件夹为编译链接文件,直接提取出来了未作修改。Src文件夹为所有库文件的源程序文件夹。Startup文件夹里面为单片机的启动文件,用于初始单片机,设置中断等过程。
在开发的时候匠牛社区官网还没有小车的原理图,Ti官方的文档里倒是有,但是需要来回去翻文档,就索性画了个简图,方便去查传感器IO引脚。
下面先来说说小车的电机的驱动开发。上面是电机的驱动芯片,从引脚定义上可以看出nSLEEP用来控制芯片使能与休眠,我们可以设置高低电平让驱动芯片使能或休眠来控制电机启动与停止。PH引脚对比电平状态可以看出是用来设置正反转的。EN引脚用来控制电机启动或停止的,我们下面就用这个引脚来控制电机调速。上面原理图中为了看着方便,把nSLEEP定义为SLP,PH定义为DIR,EN定义为PWM。下面讲解重点说源程序怎么实现的,相关宏定义请自行查阅提供的附件。
先定义两个定时器的PWM配置,用来生成两路PWM控制转速。
- Timer_A_PWMConfig LeftPWM_Config =
- {
- TIMER_A_CLOCKSOURCE_SMCLK,
- TIMER_A_CLOCKSOURCE_DIVIDER_1,
- TIMER_PERIOD,
- TIMER_A_CAPTURECOMPARE_REGISTER_4,
- TIMER_A_OUTPUTMODE_RESET_SET,
- DUTY_CYCLE0
- };
- Timer_A_PWMConfig RightPWM_Config =
- {
- TIMER_A_CLOCKSOURCE_SMCLK,
- TIMER_A_CLOCKSOURCE_DIVIDER_1,
- TIMER_PERIOD,
- TIMER_A_CAPTURECOMPARE_REGISTER_3,
- TIMER_A_OUTPUTMODE_RESET_SET,
- DUTY_CYCLE1
- };
复制代码配置电机相关的IO引脚,并初始化PWM定时器 - GPIO_setAsPeripheralModuleFunctionOutputPin(LeftPWM_GPIO,LeftPWM_GPIO_PIN,GPIO_PRIMARY_MODULE_FUNCTION);
- GPIO_setAsOutputPin(LeftDIR_GPIO, LeftDIR_GPIO_PIN);
- GPIO_setAsOutputPin(LeftSLP_GPIO, LeftSLP_GPIO_PIN);
-
- GPIO_setAsPeripheralModuleFunctionOutputPin(RightPWM_GPIO,RightPWM_GPIO_PIN,GPIO_PRIMARY_MODULE_FUNCTION);
- GPIO_setAsOutputPin(RightDIR_GPIO, RightDIR_GPIO_PIN);
- GPIO_setAsOutputPin(RightSLP_GPIO, RightSLP_GPIO_PIN);
-
- MAP_Timer_A_generatePWM(TIMER_A0_BASE, &LeftPWM_Config);
- MAP_Timer_A_generatePWM(TIMER_A0_BASE, &RightPWM_Config);
复制代码更改PWM占空比实际只用改变比较值,接着重新更新寄存器即可。 - LeftPWM_Config.dutyCycle = dutyCycle;//更新比较寄存器,即更改PWM占空比
- Timer_A_generatePWM(TIMER_A0_BASE, &LeftPWM_Config);
复制代码实际电机程序为方便使用我给封装起来了,提供一个接口可以设置正反转及PWM占空比,完整程序如下。 - /*
- 左侧电机转向、速度设置程序
- 设置电机转向及PWM占空比
- 输入:
- Direction:Forward 或 Reverse
- Speed:0-100 对应 0%-100%
- 输出:
- 无
- 示例:
- LeftMotor(Forward,50);//设置左侧电机正转,速度为全速的50%
- LeftMotor(Reverse,50);//设置左侧电机反转,速度为全速的50%
- LeftMotor(Forward,0);//设置左侧电机停转
- LeftMotor(Reverse,0);//设置左侧电机停转
- */
- void LeftMotor(uint8_t Direction,uint8_t Speed)
- {
- uint_fas**_t dutyCycle;
- if((Speed==0)||(Speed<=100))//判断数据是否合法
- {
- dutyCycle = Speed*TIMER_PERIOD/100;//将百分数换算成实际对应的比较值
- if(Speed>0)//判断速度,大于零进行方向速度设置
- {
- if(Direction)//判断方向,进行正转设置
- {
- GPIO_setOutputLowOnPin(LeftDIR_GPIO,LeftDIR_GPIO_PIN);//设置方向控制电平
- LeftPWM_Config.dutyCycle = dutyCycle;//更新比较寄存器,即更改PWM占空比
- }
- else//判断方向,进行反转设置
- {
- GPIO_setOutputHighOnPin(LeftDIR_GPIO,LeftDIR_GPIO_PIN);//设置方向控制电平
- LeftPWM_Config.dutyCycle = dutyCycle;//更新比较寄存器,即更改PWM占空比
- }
- GPIO_setOutputHighOnPin(LeftSLP_GPIO,LeftSLP_GPIO_PIN);//唤醒驱动模块
- }
- else//判断速度,不大于零进行停车设置
- {
- GPIO_setOutputLowOnPin(LeftSLP_GPIO,LeftSLP_GPIO_PIN);//休眠驱动模块
- LeftPWM_Config.dutyCycle = dutyCycle;//更新比较寄存器,即更改PWM占空比
- }
- }
- Timer_A_generatePWM(TIMER_A0_BASE, &LeftPWM_Config);
- }
复制代码
下面再说说红外遥控怎么解码,说实话不是太懂,程序移植网上大牛的,在这里说下过程吧。示波器抓的图不好看,就用逻辑分析仪又抓了个图。
程序使用一个定时器产生0.1ms的周期中断,中断中记录中断次数,处理程序根据中断次数计算时序电平持续时间,进而判断协议,进行解码。
配置中断周期为0.1ms的定时器
- Canst Timer_A_UpModeConfig upConfig =
- {
- TIMER_A_CLOCKSOURCE_SMCLK, // SMCLK Clock Source
- TIMER_A_CLOCKSOURCE_DIVIDER_12, // SMCLK/12 = 1MHz
- TIMER_PERIOD, // 100 tick period
- TIMER_A_TAIE_INTERRUPT_DISABLE, // Disable Timer interrupt
- TIMER_A_CCIE_CCR0_INTERRUPT_ENABLE , // Enable CCR0 interrupt
- TIMER_A_DO_CLEAR // Clear value
- };
复制代码 下面初始化定时器,并设置定时器中断,设置红外IO口为下降沿中断,这里要注意中断优先级,定时器的中断要高于红外遥控IO的中断。
- Timer_A_configureUpMode(TIMER_A1_BASE, &upConfig);
- Interrupt_enableInterrupt(INT_TA1_0);
- Timer_A_startCounter(TIMER_A1_BASE, TIMER_A_UP_MODE);
-
- GPIO_setAsInputPinWithPullUpResistor(IrDa_GPIO, IrDa_GPIO_PIN);
- GPIO_clearInterruptFlag(IrDa_GPIO, IrDa_GPIO_PIN);
- GPIO_interruptEdgeSelect(IrDa_GPIO,IrDa_GPIO_PIN,GPIO_HIGH_TO_LOW_TRANSITION);
- GPIO_enableInterrupt(IrDa_GPIO, IrDa_GPIO_PIN);
- Interrupt_enableInterrupt(IrDa_IRQCHANNEL);
- Interrupt_setPriorityGrouping(NVIC_APINT_PRIGROUP_7_1);
- Interrupt_setPriority(IrDa_IRQCHANNEL, 0x80);
- Interrupt_setPriority(INT_TA1_0, 0x70);
复制代码 红外口中断服务程序
- if(startflag)
- {
- if(ucTim2Flag < 150 && ucTim2Flag >= 50 ) // 接收到同步头
- {
- idx=0; // 数组下标清零
- }
- irdata[idx] = ucTim2Flag; // 获取计数时间
- ucTim2Flag = 0; // 清零计数时间,以便下次统计
- idx++; // 接收到一个数据,索引加1
- if(idx==33) // 如果接收到33个数据,包括32位数和以一个同步头
- {
- idx=0;
- ucTim2Flag = 0;
- receiveComplete = true;
- }
- }
- else // 下降沿第一次触发
- {
- idx = 0;
- ucTim2Flag = 0;
- startflag = true;
- }
复制代码 数据处理服务程序
- uint8_t i,j,idx=1; //idx 从1 开始表示对同步头的时间不处理
- uint8_t temp;
- for(i=0; i<4; i++)
- {
- for(j=0; j<8; j++)
- {
- if(irdata[idx] >=8 && irdata[idx] < 15) //表示 0
- {
- temp = 0;
- }
- else if(irdata[idx] >=18 && irdata[idx]<25) //表示 1
- {
- temp = 1;
- }
- remote_code[i] <<= 1;
- remote_code[i] |= temp;
- idx++;
- }
- }
- return remote_code[2]; // 该数组中记录的是控制码,每个按键不一样
复制代码
寻迹传感器处理也比较简单,就是在没有示波器的情况下不好弄,这里我也把程序封装起来了,只需调用API即可。
处理方法来自TI视频中介绍的,我也是第一次接触,感觉挺灵活的。主要是来判断电平持续的时间,来判断当前寻迹传感器的状态。
上面两张图我们对比可以看出,我们在采样时只要在底噪之后进行读取电平即可。 - /*
- 寻迹传感器状态获取程序
- 获取传感器1、2、3、4、5、6、7、8电平状态。
- 输入:
- value:采集IO口电平的时间,参数值小于10000。for循环共10000次,采集时间只要错过底噪电平即可。
- 输出:
- P7口电平状态。
- 示例:
- temp=Line_GetState(2000);
- */
- uint8_t Line_GetState(uin**_t value)
- {
- uint8_t state=0;
- GPIO_setAsOutputPin(LineSensorSwitch_GPIO_PORT, LineSensorSwitch_GPIO_PIN);
- GPIO_setOutputHighOnPin(LineSensorSwitch_GPIO_PORT, LineSensorSwitch_GPIO_PIN);
- GPIO_setAsOutputPin(LineSensor_GPIO_PORT, PIN_ALL8);
- GPIO_setOutputHighOnPin(LineSensor_GPIO_PORT,PIN_ALL8);
- Delay_10us(1);
- GPIO_setAsInputPin(LineSensor_GPIO_PORT, PIN_ALL8);
- for(int i=0;i<10000;i++)
- {
- if(i==value)
- {
- state=P7->IN;
- }
- }
- GPIO_setOutputLowOnPin(LineSensorSwitch_GPIO_PORT,LineSensorSwitch_GPIO_PIN);
- return state;
- }
复制代码
另外为了方便调试,移植了printf函数,下面说说怎么配置的。 设置uart配置,这里时钟用的是SMCLK,12Mhz,初始化DCO为12Mhz,其他时钟频率需要自己进行计算配置了。 - const eUSCI_UART_Config uartConfig =
- {
- EUSCI_A_UART_CLOCKSOURCE_SMCLK, // SMCLK Clock Source
- 78, // BRDIV = 78
- 2, // UCxBRF = 2
- 0, // UCxBRS = 0
- EUSCI_A_UART_NO_PARITY, // No Parity
- EUSCI_A_UART_LSB_FIRST, // LSB First
- EUSCI_A_UART_ONE_STOP_BIT, // One stop bit
- EUSCI_A_UART_MODE, // UART mode
- EUSCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION // Oversampling
- };
复制代码配置GPIO并初始化相关寄存器 - MAP_GPIO_setAsPeripheralModuleFunctionInputPin(USART_GPIO,
- USART_RX_GPIO_PIN | USART_TX_GPIO_PIN, GPIO_PRIMARY_MODULE_FUNCTION);
- /* Setting DCO to 12MHz */
- CS_setDCOCenteredFrequency(CS_DCO_FREQUENCY_12);
- //![Simple UART Example]
- /* Configuring UART Module */
- MAP_UART_initModule(EUSCI_A0_BASE, &uartConfig);
- /* Enable UART module */
- MAP_UART_enableModule(EUSCI_A0_BASE);
- /* Enabling interrupts */
- MAP_UART_enableInterrupt(EUSCI_A0_BASE, EUSCI_A_UART_RECEIVE_INTERRUPT);
- MAP_Interrupt_enableInterrupt(INT_EUSCIA0);
复制代码串口重定义 - int fputc(int ch, FILE *f)
- {
- MAP_UART_transmitData(EUSCI_A0_BASE, (uint8_t) ch);
- while (UART_getInterruptStatus(EUSCI_A0_BASE, EUSCI_A_UART_TRANSMIT_INTERRUPT_FLAG) == 0);
- return (ch);
- }
- int fgetc(FILE *f)
- {
- while(UART_getInterruptStatus(EUSCI_A0_BASE, EUSCI_A_UART_RECEIVE_INTERRUPT_FLAG) == 0);
- return (int)UART_receiveData(EUSCI_A0_BASE);
- }
复制代码
碰撞传感器在中断中做了处理,基本上涉及中断的都定义在msp432_it.c文件中,使用时可以方便修改重定义。另使用系统滴答定时器移植了延时函数,像LED、按键都完成了相关程序,负责接收蓝牙数据的串口也也初始化了都比较简单不在一一介绍了。 最后上张MDK工程的图
再说说mt7628核心板刷openwrt以及设置摄像头
比较穷,买不起好的数传模块就自己折腾了。方案选的是mt7628比网上卖的ar9331的要好,就是折腾起来比较费劲。下面是根据官方给的引脚图焊的最小系统,RJ45接口一定要买带网络变压器的,这样比较省事。我焊了俩接口一个lan一个wan,其实只焊一个lan口就行。
另外要把串口0给引出来,通过uboot来升级固件,刚开始不建议刷uboot,刷错就是俗说成砖了,解决办法就是要用编程器来刷flash比较麻烦。模块官方给了个文档,可以参考下。
串口设置什么的文档里比较详细这就不写了,下面贴下我刷固件时的日志 - U-Boot 1.1.3 (Aug 28 2017 - 15:02:42)
- Board: Ralink APSoC DRAM: 64 MB
- relocate_code Pointer at: 83fb8000
- flash manufacture id: c2, device id 20 18
- find flash: MX25L12805D
- *** Warning - bad CRC, using default environment
- ============================================
- Ralink UBoot Version: 4.3.0.0
- --------------------------------------------
- ASIC 7628_MP (Port5<->None)
- DRAM component: 512 Mbits DDR, width 16
- DRAM bus: 16 bit
- Total memory: 64 MBytes
- Flash component: SPI Flash
- Date:Aug 28 2017 Time:15:02:42
- ============================================
- icache: sets:512, ways:4, linesz:32 ,total:65536
- dcache: sets:256, ways:4, linesz:32 ,total:32768
- ##### The CPU freq = 580 MHZ ####
- estimate memory size =64 Mbytes
- RESET MT7628 PHY!!!!!!
- Please choose the operation:
- 1: Load system code to SDRAM via TFTP.
- 2: Load system code then write to Flash via TFTP.
- 3: Boot system code via Flash (default).
- 4: Entr boot command line interface.
- 7: Load Boot Loader code then write to Flash via Serial.
- 9: Load Boot Loader code then write to Flash via TFTP.
- default: 3
- 3
- You choosed 2
- 0
- luke: BootType=2
-
- 2: System Load Linux Kernel then write to Flash via TFTP.
- Warning!! Erase Linux in Flash then burn new one. Are you sure?(Y/N)
- Please Input new ones /or Ctrl-C to discard
- Input device IP (192.168.16.123) ==:192.168.1.23
- Input server IP (192.168.16.112) ==:192.168.1.133
- Input Linux Kernel filename () ==:7628.bin
- netboot_common, argc= 3
- NetTxPacket = 0x83FE5B00
- KSEG1ADDR(NetTxPacket) = 0xA3FE5B00
- NetLoop,call eth_halt !
- NetLoop,call eth_init !
- Trying Eth0 (10/100-M)
- Waitting for RX_DMA_BUSY status Start... done
- ETH_STATE_ACTIVE!!
- TFTP from server 192.168.1.133; our IP address is 192.168.1.23
- Filename '7628.bin'.
- TIMEOUT_COUNT=10,Load address: 0x80100000
- Loading: checksum bad
- checksum bad
- Got ARP REPLY, set server/gtwy eth addr (80:c1:6e:3e:49:1c)
- Got it
- #################################################################
- #################################################################
- #################################################################
- #################################################################
- #################################################################
- #################################################################
- #################################################################
- #################################################################
- #################################################################
- #################################################################
- #################################################################
- #################################################################
- #################################################################
- #################################################################
- #################################################################
- #################################################################
- #################################################################
- ############################################################Got ARP REQUEST, return our IP
- #####
- #################################################################
- #################################################################
- #################################################################
- #################################################################
- #################################################################
- #################################################################
- #################################################################
- #################################################################
- #################################################################
- #################################################################
- #################################################################
- #################################################################
- #################################################################
- #################################################################
- #################################################################
- #################################################################
- #################################################################
- #################################################################
- #################################################################
- #################################################################
- #################################################################
- ##########################
- done
- Bytes transferred = 13107369 (c800a9 hex)
- NetBootFileXferSize= 00c800a9
- ........................................................................................................................................................................................................
- ........................................................................................................................................................................................................
- .
- .
- Done!
- ## Booting image at bc050000 ...
- Image Name: MIPS LEDE Linux-4.4.70
- Image Type: MIPS Linux Kernel Image (lzma compressed)
- Data Size: 1384509 Bytes = 1.3 MB
- Load Address: 80000000
- Entry Point: 80000000
- Verifying Checksum ... OK
- Uncompressing Kernel Image ... OK
- No initrd
- ## Transferring control to Linux (at address 80000000) ...
- ## Giving linux memsize in MB, 64
- Starting kernel ...
- [ 0.000000] Linux version 4.4.70 (sxx@sxx-pc) (gcc version 5.4.0 (LEDE GCC 5.4.0 r3508-53f5d59) ) #0 Mon Jun 5 19:30:05 2017
- [ 0.000000] Board has DDR2
- [ 0.000000] Analog PMU set to hw control
- [ 0.000000] Digital PMU set to hw control
- [ 0.000000] SoC Type: MediaTek MT7628AN ver:1 eco:2
- [ 0.000000] bootconsole [early0] enabled
- [ 0.000000] CPU0 revision is: 00019655 (MIPS 24KEc)
- [ 0.000000] MIPS: machine is WRTnode2P
- [ 0.000000] Determined physical RAM map:
- [ 0.000000] memory: 04000000 @ 00000000 (usable)
- [ 0.000000] Initrd not found or empty - disabling initrd
- [ 0.000000] Zone ranges:
- [ 0.000000] Normal [mem 0x0000000000000000-0x0000000003ffffff]
- [ 0.000000] Movable zone start for each node
- [ 0.000000] Early memory node ranges
- [ 0.000000] node 0: [mem 0x0000000000000000-0x0000000003ffffff]
- [ 0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x0000000003ffffff]
- [ 0.000000] Primary instruction cache 64kB, VIPT, 4-way, linesize 32 bytes.
- [ 0.000000] Primary data cache 32kB, 4-way, PIPT, no aliases, linesize 32 bytes
- [ 0.000000] Built 1 zonelists in Zone order, mobility grouping on. Total pages: 16256
- [ 0.000000] Kernel command line: console=ttyS0,115200 **fstype=squashfs,jffs2
- [ 0.000000] PID hash table entries: 256 (order: -2, 1024 bytes)
- [ 0.000000] Dentry cache hash table entries: 8192 (order: 3, 32768 bytes)
- [ 0.000000] Inode-cache hash table entries: 4096 (order: 2, 16384 bytes)
- [ 0.000000] Writing ErrCtl register=000599d4
- [ 0.000000] Readback ErrCtl register=000599d4
- [ 0.000000] Memory: 60388K/65536K available (3201K kernel code, 146K rwdata, 776K rodata, 156K init, 198K bss, 5148K reserved, 0K cma-reserved)
- [ 0.000000] SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
- [ 0.000000] NR_IRQS:256
- [ 0.000000] intc: using register map from devicetree
- [ 0.000000] CPU Clock: 580MHz
- [ 0.000000] clocksource_probe: no matching clocksources found
- [ 0.000000] clocksource: MIPS: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 6590553264 ns
- [ 0.000012] sched_clock: 32 bits at 290MHz, resolution 3ns, wraps every 7405115902ns
- [ 0.015353] Calibrating delay loop... 385.84 BogoMIPS (lpj=1929216)
- [ 0.080517] pid_max: default: 32768 minimum: 301
- [ 0.089777] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes)
- [ 0.102723] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes)
- [ 0.122783] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
- [ 0.142175] futex hash table entries: 256 (order: -1, 3072 bytes)
- [ 0.154344] pinctrl core: initialized pinctrl subsystem
- [ 0.165286] NET: Registered protocol family 16
- [ 0.177435] rt2880-pinmux pinctrl: invalid group "jtag" for function "gpio"
- [ 0.298009] mt7620-pci 10140000.pcie: Port 0 N_FTS = 1b105000
- [ 0.459017] mt7620-pci 10140000.pcie: PCIE0 no card, disable it(RST&CLK)
- [ 0.472156] mt7620-pci: probe of 10140000.pcie failed with error -1
- [ 0.494770] mt7621_gpio 10000600.gpio: registering 32 gpios
- [ 0.505835] mt7621_gpio 10000600.gpio: registering 32 gpios
- [ 0.516841] mt7621_gpio 10000600.gpio: registering 32 gpios
- [ 0.528758] i2c-mt7621 10000900.i2c: clock 100KHz, re-start not support
- [ 0.542047] Advanced Linux Sound Architecture Driver Initialized.
- [ 0.554969] clocksource: Switched to clocksource MIPS
- [ 0.566334] NET: Registered protocol family 2
- [ 0.575789] TCP established hash table entries: 1024 (order: 0, 4096 bytes)
- [ 0.589489] TCP bind hash table entries: 1024 (order: 0, 4096 bytes)
- [ 0.602008] TCP: Hash tables configured (established 1024 bind 1024)
- [ 0.614653] UDP hash table entries: 256 (order: 0, 4096 bytes)
- [ 0.626118] UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
- [ 0.638742] NET: Registered protocol family 1
- [ 0.652567] Crashlog allocated RAM at address 0x3f00000
- [ 0.678200] squashfs: version 4.0 (2009/01/31) Phillip Lougher
- [ 0.689667] jffs2: version 2.2 (NAND) (SUMMARY) (LZMA) (RTIME) (CMODE_PRIORITY) (c) 2001-2006 Red Hat, Inc.
- [ 0.711667] io scheduler noop registered
- [ 0.719346] io scheduler deadline registered (default)
- [ 0.730375] Serial: 8250/16550 driver, 3 ports, IRQ sharing disabled
- [ 0.744148] console [ttyS0] disabled
- [ 0.751165] 10000c00.uartlite: ttyS0 at MMIO 0x10000c00 (irq = 28, base_baud
复制代码 等固件启动完成,输入路由地址进入设置页面,登陆密码为空,直接点登陆进入设置
点击上侧“服务”选项,在点击下侧的“MJPG-streamer”根据自己的摄像头进行设置就行了,只要是uvc免驱的好像都支持。 设置完成,启动成功的话摄像头的指示灯会亮,我的就是小绿灯亮了。在浏览器中输入路由ip及MJPG-streamer端口就可访问摄像头的画面了。
蓝牙模块买的是带AT固件的,想着其他同学使用的话可以方便移植,将模块焊好后准备调试发现一直无响应最后检查发现电源接的5V,连个OK我都没见到呢。。。没办法就使用不带固件的,重新做了个小板加了个ams117 3.3怕再接错。程序自己找例程改了个透传的固件。IAR工程,但是需要ccdebug来下程序。
蓝牙APP使用的是易安卓编的,全中文程序不再介绍。
最终小车效果
上面俩图是做好后测试没问题拍的,后面把小车拿出去跑发现MT7628核心板有点热,就又换了下布局加装了散热片。
|