嘿!您似乎在 United States,您想使用我们的 English 网站吗?
Switch to English site
Skip to main content

Sony Spresense将先进的物联网功能融入微型板

Main30_ab5a42ce339330e5d51be4846d983a9d3050ea84.jpg

Sony Spresense尺寸虽小,但集成了摄像头,GNSS,丰富的GPIO和支援Arduino。

俗话说快速,便宜或好 - 选择两个。 然而,索尼Spresense将高性能,低能耗的多核处理器与8MB闪存,相机接口,GNSS以及不缺I / O相结合,比单独GNSS开发板支付的费用多一点。 不仅如此,还完全支持使用Arduino IDE,或者是基于GNU工具链构建的SDK,以及基于NuttX RTOS的开发人员框架。

Packaging_745c4442c8dd0cb2f49d11df025ce726bf2994da.jpg

在这篇文章中,我们先看看Spresense 主板,扩展和摄像头板,然后再继续运行一些提供的示例。

索尼CXD5602的核心

MainBoard_0c9a4c49030360074ef690fbe8d014c773d1d2eb.jpg

Spresense主板 (178-3376) 是围绕索尼CXD6502微控制器构建的,该微控制器可将大量功能集成到尺寸仅为6.5 x 6.5 mm的IC封装中。

MainBoardSignals_c9dfa2b619f40da7b42cc36fb08d1cc6281ba38c.jpg

该MCU采用低功耗FD-SOI技术,具有多种睡眠模式并分为多个电源域,主要针对深度嵌入式物联网应用,具有低功耗要求。

MCU_BlockDiagram_dc252feacf2d0c598eae6006864df2b0937560ea.jpg

CX5602应用领域具有六个Arm Cortex-M4处理器拥有1.5MB SRAM,第七个处理GNSS接收器DSP。 第八个也是最后一个核心是Cortex-M0,它被配置为系统和I / O处理器。 其他主要功能包括:

  • 图像处理域,支持各种格式和捕获控制
  • 具有抽取和数字滤波的传感器域,以及DMA控制器和接口,包括:
    • I2C
    • SPI
    • ADC
    • PWM
  • 存储/连接,包括eMMC和USB
  • 实时时钟(RTC)

Spresense主板还有8MB闪存,GNSS天线,Micro USB和相机连接器,LED和按钮,以及用于连接扩展板或定制板的高密度连接器。

除此之外,主板还集成了Sony CXD5247GF,具有电源管理功能和音频模块。 后者提供具有可编程增益和ADC的4x通道模拟麦克风放大器,以及用于8欧姆负载的D类音频输出放大器。

Arduino 外形

ExtensionBoardSignals1_a9e35adc53810083cf11e1483a6aed5dad43ca5b.jpg

在集成自定义硬件时,就像拥有如此紧凑的模块一样好,在原型设计的早期阶段,有一个更大尺寸是很好的,可以有更多的I / O接口,如果可能的话,水平移位和模块化扩张。

ExpansionBoard1_55b37c2d328079117eacfbaf091953810cad10ea.jpg

Spresense扩展板 (178-3377) 提供了更多功能,它将模块转换为Arduino Uno外形,带有Shield接头,3.5mm插孔,Micro SD,附加USB和麦克风接头。

500万像素摄像头

Camera_2a58ebcf18af33ac30cfd3158c4ec31920d403f6.jpg

摄像头通过短扁平电缆直接与主板连接,像素为500万,灵敏度为40-800 ISO。 具有各种曝光和聚焦控制模式,以及快门速度范围和场景选择预设。 高清运动格式支持最高30 fps,1080p分辨率,60fps,720p。

因此,知道它的各种强大硬件功能后,我们如何对Spresense进行编程?

支援Arduino IDE

SSS_BoardsManager_d21da66a01d8a8552dd3e51e0a98c9054eb8d79e.jpg

到目前为止,如果您不是一位经验丰富的嵌入式开发人员,最简单的入门方法是利用Arduino平台支持。 启动和运行很容易,涉及:

  1. 安装 Arduino IDE
  2. 添加新的 Boards Manager URL
  3. 搜索并安装Spresense板支持
  4. 更新Spresense引导加载程序bootloader

更多详细信息,请参阅官方文档

SSS_LED_Test_87f08a7e3ec08499632ca81bd78c1d2b07d9c234.jpg

用于验证安装用途的例子......你猜对了,LED! 这里没有任何意外,在编译和上传后,主板上的四个LED按顺序点亮。

很高兴知道IDE,电路板支持和硬件运作正常,但显然我们可以做的更多令人兴奋的事情,而不仅仅是点亮一些LED。 因此,如果我们从提供的相机示例中查看关键部分。

#include <SDHCI.h>
#include <stdio.h>  /* for sprintf */
#include <Camera.h>

SDClass  theSD;
int take_picture_count = 0;

void CamCB(CamImage img)
{

  /* Check the img instance is available or not. */

  if (img.isAvailable())
    {

      /* If you want RGB565 data, convert image data format to RGB565 */

      img.convertPixFormat(CAM_IMAGE_PIX_FMT_RGB565);

      /* You can use image data directly by using getImgSize() and getImgBuff().
       * for displaying image to a display, etc. */
}

void setup()
{

  /* begin() without parameters means that
   * number of buffers = 1, 30FPS, QVGA, YUV 4:2:2 format */

  theCamera.begin();

  /* Start video stream.
   * If received video stream data from camera device,
   *  camera library call CamCB.
   */

  theCamera.startStreaming(true, CamCB);

  /* Auto white balance configuration */

  theCamera.setAutoWhiteBalanceMode(CAM_WHITE_BALANCE_DAYLIGHT);

  /* Set parameters about still picture.
   * In the following case, QUADVGA and JPEG.
   */

  theCamera.setStillPictureImageFormat(
     CAM_IMGSIZE_QUADVGA_H,
     CAM_IMGSIZE_QUADVGA_V,
     CAM_IMAGE_PIX_FMT_JPG);
}

/**
 * @brief Take picture with format JPEG per second
 */

void loop()
{
  sleep(1); /* wait for one second to take still picture. */

  /* This sample code can take 100 pictures in every one second from starting. */

  if (take_picture_count < 100)
    {

      /* Take still picture.
      * Unlike video stream(startStreaming) , this API wait to receive image data
      *  from camera device.
      */
  
      CamImage img = theCamera.takePicture();

      /* Check availability of the img instance. */
      /* If any error was occured, the img is not available. */

      if (img.isAvailable())
        {
          /* Create file name */
    
          char filename[16] = {0};
          sprintf(filename, "PICT%03d.JPG", take_picture_count);

          /* Save to SD card as the finename */
    
          File myFile = theSD.open(filename, FILE_WRITE);
          myFile.write(img.getImgBuff(), img.getImgSize());
          myFile.close();
        }

      take_picture_count++;
    }
}

这里的串口调试已被删除,它变更简单; 我们加入用于SD卡和相机支持的库,并定义一个函数来检查图像数据是否可用并将其转换为RGB565。 然后我们设置一些基本参数并开始捕获图像。

CameraTest_9ce2400e11d79922891ec87c66f0c17f41325d26.jpg

使用默认设置,结果并不差,可以通过配置室内荧光灯的白平衡来改善。

其他的Arduino示例包括:

  • 音频录制和播放,以及MP3编码和解码
  • 使用深度神经网络(DNN)进行手写数字识别
  • GNSS追踪器
  • 伺服马达控制

Spresense SDK

SSS_SDK_9d9e469c4a92754e74c1d1851aede96136898d81.jpg

它还提供了一个全面的SDK,这将更有助于体验嵌入式开发人员和具有更高级用例的人员。 在Ubuntu Linux上启动和运行它只需要通过包管理系统安装Arm工具链,从NuttX构建和安装包,然后安装Spresense SDK本身。 这需要几分钟,详细信息请参阅官方文档

SSS_SDK_make_53ed3e9b189e134abc4a6fd0191fdad3f5f83f16.jpg

安装SDK后,会有一些设置命令和两个make命令,我们使用经典的“Hello,World”示例构建了一个NuttX图像。 它还需要一个命令才能将其刷新到电路板,然后我们可以启动一个终端仿真器,在本例中为Minicom,以连接它。

SSS_SDK_hello_9306513d891f66bf3c244410581ecd279ff74388.jpg

一旦电路板启动,我们就会进入NuttX shell,从这里可以输入“hello”来运行我们的示例。

SSS_SDK_shell_43d58b7d4ecd13d2f6a8f563d7d9704f40775c22.jpg

我们还可以输入“help”来获取命令列表,并运行ls和ps等列出文件和进程。是的,一个真正的小型实时操作系统在我们的主板上运行并具有互动式板面!

Spresense SDK示例包括:

  • Decimator(数据下采样,以减少处理开销),支持陀螺仪,加速度计和各种磁力计
  • 使用机载GNSS进行Geofence地理围栏(例如将无人机保持在指定区域内)
  • 使用连接的调制解调器通过LTE进行HTTP GET(例如API访问)
  • ADC(模拟传感器,音频)
  • PWM(电机和风扇速度控制等)

最后的想法

Spresense硬件特别令人印象深刻,在这里我们几乎没有触及其真正的能力。 由于6x Arm内核运行速度高达156MHz,其MCU能够运行一些非常苛刻的应用程序,并且由于SDK支持消息传递和共享内存,因此开发这些以利用硬件应该变得更加容易。

除了MCU应用领域的原始性能之外,Spresense还受益于基于硬件的传感器数据抽取和过滤,以及专用系统和I / O处理器。 当所有这些与丰富的接口和NuttX RTOS支持相结合时,它实现了强大的组合 - 尽管它也非常适合低功耗(消耗)应用,因此非常适合高级物联网使用案例。

简而言之,Spresense是一个功能强大的开发板,具有出色的开发工具和高质量的文档,可以实现一些非常令人兴奋的应用程序。

Andrew Back

Open source (hardware and software!) advocate, Treasurer and Director of the Free and Open Source Silicon Foundation, organiser of Wuthering Bytes technology festival and founder of the Open Source Hardware User Group.
DesignSpark Electrical Logolinkedin