索尼Spresense拆箱与Spresense SDK运行测试

电子说

1.3w人已加入

描述

期盼了许久,终于收到了两个包裹,一个是主板,另一个为扩展板。

主板的包裹里只有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 -R    
cp ../examples/audio_player/PLAYLIST/ -R
mkdir /BIN
pushd modules/audio/dsp
cp MP3DEC WAVDEC /BIN/
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制造,可以单独购买,但目前只在日本购买。希望他们能够找到一种更简单的订购方法,可能在不久的将来使用完整的开发套件。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分