电子说
期盼了许久,终于收到了两个包裹,一个是主板,另一个为扩展板。
主板的包裹里只有CXD5602PWBMAIN1板和信息表,板的顶部包括一个复位按钮、四个用户LED、一个电源LED、一个启动恢复按钮、相机接口、索尼CXD5247电源管理和音频模拟接口芯片(下图中的黑色),索尼CXD5602 hexa核心Arm Cortex-M4F微控制器支持GNSS - 在封装上看作D5602GG,两排2.54mm间距I / O接头,以及板极右边缘的GNSS天线。
该板的底部采用MXIC MX25U6435F SPI NOR闪存,8MB容量,100针连接器,用于连接主板和扩展板,CP2102N USB到TTL芯片,以及用于电源和编程的微型USB端口。
信息表主要包含法律术语,规范以及Spresense支持网站的链接和QR代码。
扩展板附带了类似的信息表,以及用于将主板固定到位的四个塑料钻头。
扩展板配有Arduino兼容接头,100针插座,用于连接主板,部分跳线,3.5mm音频插孔和micro SD卡插槽。
下图为电路板的正面,另一侧主要是两个芯片:72040电平转换器和TI LSF0108八进制双向多电压电平转换器,当然也有着“扩展”用的微型USB端口。
两块板的组装都很简单,只需将四个黑色塑料钻头插入扩展板的安装孔中,将主板放在顶部,然后将其向下推。
如Spresense软件文档中所述,有两种方法可以使用Spresense板:
Spresense Arduino库 - 使用许多开发人员熟悉的Arduino IDE。
Spresense SDK - 索尼最初的CXD5602芯片组开发环境,基于NuttX实时操作系统,并利用GNU Make工具链。低级API使开发人员能够优化内存使用,节省电源,控制多核处理等等,而Arduino库可能无法实现这一点。
下文针对Spresense SDK软件系统进行说明。
▲Spresense SDK的结构
让我们试着跟着说明指南在运行Ubuntu 18.04的笔记本电脑上调试运行它。
安装Spresense SDK
首先,我们需要在终端窗口中安装一些terminal windows:
1 | sudo apt install git gperf libncurses5-dev flex bison gcc-arm-none-eabi genromfs pkg-config autoconf automake cmake |
下一步是从nuttx-tools安装kconfig-frontends包:
1 2 3 4 5 |
git clone https://bitbucket.org/nuttx/tools.git cd tools/kconfig-frontends/ ./configure --disable-shared make -j8 sudo make install |
查看SDK源代码:
1 2 3 |
cd ../.. git clone --recursive https://github.com/sonydevworld/spresense.git git submodule foreach git checkout master |
USB连接
将当前用户添加到拨出组,然后注销以确保可以访问串行端口:
1 | sudo usermod -a -G dialout $USER |
是时候通过USB将主板连接到计算机了,这是内核日志的输出:
1 2 3 4 5 6 7 8 |
[99898.675476] usb 3-2: new full-speed USB device number 3 using xhci_hcd [99898.849262] usb 3-2: New USB device found,idVendor=10c4, idProduct=ea60 [99898.849267] usb 3-2: New USB device strings:Mfr=1, Product=2, SerialNumber=3 [99898.849270] usb 3-2: Product: CP2102N USB to UART Bridge Controller [99898.849272] usb 3-2: Manufacturer: Silicon Labs [99898.849275] usb 3-2: SerialNumber:1601ea6abb61e811841264b55bfef139 [99898.851295] cp210x 3-2:1.0: cp210x converter detected [99898.864393] usb 3-2: cp210x converter now attached to ttyUSB0 |
电路板被正确检测为具有10c4 VID和ea60 PID的CP210x转换器。
Spresense SDK安装程序
首先设置初始NuttX内核配置:
1 2 |
cd spresense/sdk tools/config.py --kernel release |
然后设置初始SDK配置:
1 | tools/config.py examples/hello |
输出:
1 2 3 4 5 6 7 |
WARNING: New loader v1.1.0 is required, please download and install. Download URL : https://developer.sony.com/file/download/download-spresense-firmware-v1-1-000 Install command: 1. Extract loader archive into host PC. ./tools/flash.sh -e 2. Flash loader into Board. ./tools/flash.sh -l/home/jaufranc/edev/spresense/spresense/firmware/spresense -c |
此时提示要求安装新的loader,由于下载URL需要EULA,因此无法从命令行来下载。但下载后,可以使用以下命令轻松将其闪存到电路板:
1 2 3 4 |
cd tools mv ~/Downloads/spresense-binaries-v1.1.0.zip . ./flash.sh -e spresense-binaries-v1.1.0.zip sudo ./flash.sh -l ../../firmware/spresense/ -c/dev/ttyUSB0 |
命令输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
>>> Install files ... install -b 115200 Install ../../firmware/spresense/loader.espk Waiting for XMODEM (CRC or 1K) transfer. Ctrl-X to cancel. ....................................................................................................................115856 bytes loaded. Package validation is OK. Saving package to "loader" updater# install -b 115200 Install ../../firmware/spresense/gnssfw.espk Waiting for XMODEM (CRC or 1K) transfer. Ctrl-X to cancel. ..........................................................................................................................................................................................................................................................................................................................................................................................................................................................450336bytes loaded. Package validation is OK. Saving package to "gnssfw" updater# sync updater# Restarting the board ... reboot |
构建示例映像:
1 2 3 |
cd .. make buildkernel -j8 make -j8 |
最终在当前目录中使用nuttx.spk固件:
1 2 |
ls nuttx.spk -l -rw-r--r-- 1 jaufranc jaufranc 153776 ม.ค. 5 16:11nuttx.spk |
刷新并运行固件
此时,系统要求刷新引导加载程序,但这项命令已经在上面完成了,所以我们可以刷flashtx.spk:
1 | sudo tools/flash.sh -c /dev/ttyUSB0 nuttx.spk |
命令输出:
1 2 3 4 5 6 7 8 9 10 |
>>> Install files ... install -b 115200 Install nuttx.spk Waiting for XMODEM (CRC or 1K) transfer. Ctrl-X to cancel. .........................................................................................................................................................153776bytes loaded. Package validation is OK. Saving package to "nuttx" updater# sync updater# Restarting the board ... reboot |
运行hello world程序需要使用minicom或其他工具连接115200 8N1参数的串口:
1 | minicom -D /dev/ttyUSB0 -b 115200 -s |
在串行端口设置中禁用硬件流控制,然后按Esc并选择Exit退出。我们现在应该可以访问NuttX的NuttShell(NSH)shell。
键入hello以运行演示程序:
1 2 3 4 |
NuttShell (NSH)NuttX-7.22 nsh> hello Hello,World!! nsh> |
成功,hello world程序的源代码可以在examples / hello / hello_main.c中找到,是典型的C语的hello world程序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
**************************************************************************** * Included Files ****************************************************************************/ #include #include /**************************************************************************** * Public Functions ****************************************************************************/ /**************************************************************************** * hello_main ****************************************************************************/ #ifdef CONFIG_BUILD_KERNEL int main(int argc, FAR char *argv[]) #else int hello_main(int argc, char *argv[]) #endif { printf("Hello, World!! "); return 0; } |
作为参考,NuttX shell有一些类似于busybox中的命令:
1 2 3 4 5 6 7 8 9 10 11 12 |
nsh> help help usage: help [-v] [ [ date help mksmartfs rm uname ? dd hexdump mh rmdir umount basename df kill mount set unset break echo ls mv sh usleep cat printf mb mw shutdown xd cd exec mkdir poweroff sleep cp exit mkfatfs ps test cmp false mkfifo pwd time dirname free mkrd reboot true |
Spresense中的示例项目
Hello World是开始运行很好的示例程序,但Spresense SDK还有其他更有趣的样本:
1 2 3 4 5 6 7 8 9 10 11 12 |
ls examples/ accel camera gyro press adc colorsensor hello prime alarm decimator helloxx proximity Application.mk dnnrt_lenet Kconfig pwm asmp fft libexamples.a README.md audio_player fwupdate LibTarget.mk sixaxis audio_player_objif geofence light tilt audio_recorder gnss lte_http_get voice_call audio_through gnss_atcmd mag voice_command bluetooth_le_peripheral gnss_factory Make.defs watchdog bluetooth_spp gnss_pvtlog Makefile |
每一个示例程序都都在Spresense NuttX的开发指南中详细地描述,但并未描述是何种类型或者是否新颖的样本。
某些示例项目需要安装额外的硬件,如相机附加装置,蓝牙LE附加装置,传感器附加装置等。可以通过向下滚动开发者网站的主页面找到这些列表。
由于音频和GNSS是电路板的一些主要功能,以下将尝试使用C++和C语言编写的audio_player和gnss的示例程序。
Spresense音频播放器
构建和刷新过程与hello world程序相同,并在sdk目录中执行以下命令:
1 2 3 |
./tools/config.py examples/audio_player make -j8 sudo tools/flash.sh -c /dev/ttyUSB0 nuttx.spk |
该程序被加载到主板上,但我们需要一些额外的文件存储在micro SD卡中,其中包含音乐,播放列表和“worker”二进制文件,如audio_player示例目录中的README.txt文件所述:
之后,您可以在目录sdk / modules / audio / dsp中看到工作二进制文件'MP3DEC','WAVDEC'。
在选项指定的路径中存储工作二进制文件,播放列表和播放内容。
- 默认路径
worker二进制文件:/ mnt / sd0 / BIN
播放列表:/ mnt / sd0 / PLAYLIST 内容:/ mnt / sd0 / AUDIO
作为播放列表的示例,PLAYLIST文件夹中有TRACK_DB.CSV。另外,作为内容示例,AUDIO文件夹中有Sound.mp 3。Sound.mp3的采样频率为48000,位长16,编解码器MP3文件。
起初出现这些提示时,还存在困惑,但最终明白后将文件复制到用FAT32格式化的4GB micro SD卡:
1 2 3 4 5 6 |
cp ../examples/audio_player/AUDIO cp ../examples/audio_player/PLAYLIST/ mkdir pushd modules/audio/dsp cp MP3DEC WAVDEC popd |
现在将microSD卡插入Spresense板,并连接扬声器,然后在NuttShell中启动应用程序。
1 2 3 4 5 |
NuttShell (NSH)NuttX-7.22 nsh> player Start AudioPlayer example Running time is 10sec Running time is 10 sec |
一切似乎按预期工作,但听不到任何音频。检查音频插孔连接是否接触不良,扬声器的功率和音量水平,但仍然没有声音。后来设想也许Spresense主板和扩展板之间可能存在不良接触,所以按下了主板最终成功了!终于可以听到Sound.mp3文件发出的哔声,有趣的是,微型SD卡确实有效,但不是音频。
GNSS样本
让试一试GNSS示例程序:
1 2 3 |
./tools/config.py examples/gnss make -j8 sudo tools/flash.sh -c /dev/ttyUSB0 nuttx.spk |
顺便说一下记得在运行flash.sh前退出minicom,否则会得到以下错误:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Traceback (most recent call last): File "serial/serialposix.py", line 495, in read serial.serialutil.SerialException: device reports readiness to read but returned no data (device disconnected or multiple access on port?) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "flash_writer.py", line 504, in File "flash_writer.py", line 446, in main File "flash_writer.py", line 316, incancel_autoboot File "flash_writer.py", line 263, in readline File "serial/serialposix.py", line 505, in read serial.serialutil.SerialException: read failed:device reports readiness to read but returned no data (device disconnected or multiple access on port?) [8067] Failed to execute script flash_writer |
另外还需要注意使用将menuconfig引入安装选项的选项来运行config.py。
1 | ./tools/config.py -m examples/gnss |
继续进行GPS测试,我试图将电路板靠近窗户,但我所处的建筑结构并不容易接收GPS信号,在1小时30分之后,我只获得了UTC时间。所以我搬到了户外,重新启动了电路板,一切都很顺利,我在24秒后获得了UTC时间:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
NuttShell (NSH) NuttX-7.22 nsh> nsh> nsh> gnss Hello, GNSS(USE_SIGNAL) SAMPLE!! start GNSS OK >Hour:0, minute:0, sec:3, usec:497 >No Positioning Data >Hour:0, minute:0, sec:4, usec:512 >No Positioning Data >Hour:0, minute:0, sec:5,usec:15289 ... >No Positioning Data >Hour:0, minute:0, sec:23, usec:507 >No Positioning Data >Hour:0, minute:0, sec:24, usec:522 >No Positioning Data >Hour:6, minute:59, sec:32, usec:554 >No Positioning Data >Hour:6, minute:59, sec:33, usec:561 >No Positioning Data |
并在1分40秒后定位数据:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
>Hour:7, minute:0, sec:47,usec:559 >No Positioning Data >Hour:7, minute:0, sec:48,usec:533 >No Positioning Data >Hour:7, minute:0, sec:49,usec:533 >No Positioning Data >Hour:7, minute:0, sec:49,usec:769162 >LAT37.02.1428 >LNG95.36.5893 >Hour:7, minute:0, sec:50,usec:578 >LAT37.02.1428 >LNG95.36.5893 >Hour:7, minute:0, sec:51, usec:574 |
样本代码太长,无法在本次审核中详细介绍,但您可以在examples目录中找到源代码,Spresense SDK文档看起来结构清晰,非常详细和透彻。
总结
我不得不承认Spresense主板上进行的一切评测都很顺利,开发的文档看起来很棒。但对于大多数项目,可能需要附加板,因为在没有任何类型的无线或有线连接的情况下,必须有许多需要GNSS和音频的应用。
索尼Spresense主板在Framos US上售价65美元,也可以在45美元左右找到扩展板,很快就会有一个500万像素的摄像头板将在本月晚些时候推出。Spresense相机售价在计算增值税后29欧元,传感器和蓝牙附加板由ROHM制造,可以单独购买,但目前只在日本购买。希望他们能够找到一种更简单的订购方法,可能在不久的将来使用完整的开发套件。
全部0条评论
快来发表一下你的评论吧 !