BrainCraft HAT:树莓派机器学习扩展板

最近Adafruit出了一款名叫BrainCraft的带屏幕扩展版,配上树莓派摄像头和扬声器。可以让树莓派机器学习演示起来简单不少。​

比如,你可以在这个组合上跑个Tensorflow Lite,然后做成物品识别装置。识别万物,语音表达。

当然,既然涉及AI计算,散热风扇肯定不能少。

目前该扩展板在境外的售价大概是39.95美元,大约折合人民币261.30元。

相关微博视频链接:

https://weibo.com/5408421566/JB3xhirVU?from=page_1005055408421566_profile&wvr=6&mod=weibotime&type=comment

如果不知道怎么操作和安装这个组合,可以访问:

https://learn.adafruit.com/running-tensorflow-lite-on-the-raspberry-pi-4/display-setup

让鸿蒙智能家居开发板与AWS IoT云完美连通

本期直播简介:

使用鸿蒙智能家居开发板连通AWS IoT云平台


直播课程大纲:

1、AWS IoT平台介绍

2、AWS IoT SDK介绍

3、移植AWS IoT SDK到HarmonyOS

4、实现HarmonyOS接入AWS IoT

三大隐藏福利:

1、讲师在线答疑互动

2、一个小时两轮抽奖

3、进群掌握一手资讯

讲师介绍:

连志安——广州旗点智能科技有限公司创始人

从事物联网行业开发,擅长物联网、嵌入式、Linux、HarmonyOS、RTOS等技术。

书籍《物联网——嵌入式开发实战》

直播抽奖:

免费报名+到会看直播,赢取HarmonyOS官方联名T恤、HarmonyOS官方开发板(HiSpark Wi-Fi IoT 智能家居套件)

(中奖用户所填写收件人姓名、电话、地址需为真实信息,信息仅用于工作人员联系用户发放奖品。)

适合人群:

想要学习以下知识的人群:

1、HarmonyOS网络通信

2、利用HarmonyOS连接云平台

3、AWS IoT平台接入

扫码进群:

扫描下方二维码,加入AWS技术交流群

(如无法进群,请添加小助手微信:xiao51cto,备注“AWS加群”)

触碰即盛放的“宝莲灯”——Arduino创意作品

编者注:这是一个名叫JiříPraus的外国小哥实现的Arduino创意作品,实际上是“郁金香”,但看着太像中国神话故事里的“宝莲灯”了。

轻轻抚摸就会绽放,它的六个花瓣将缓慢打开并照耀出彩虹般的光。当花瓣闭合时,它们会产生令人难以置信的带有叶子图案的光。

所需材料:

Arduino Nano R3
SG90微型伺服电机
TTP223触摸传感器
1mm黄铜丝
2mm黄铜管
0.3mm绝缘铜线
WS2812 5050 NeoPixel LED灯 x 7
白色SMD 1206 LED x 30

附注:如何焊接黄铜

https://davidneat.wordpress.com/2015/05/03/a-quick-guide-to-soldering-brass/amp/

推杆如何与花瓣一起运动

当推杆向上移动时,它将连杆和花瓣向下拉。当它向下移动时,它拖着连杆,将花瓣闭合。

单片花瓣的构成:

花瓣由黄铜细条组成,花瓣内有5个白色LED和同一根导线构成的“静脉”结构。

相同的花瓣,一共要做6个。否则它们在关闭时不会构成漂亮的郁金香形状,甚至会卡住。

相关代码:


#include <Adafruit_TiCoServo.h>
#include "SoftPWM.h"

#define NEOPIXEL_PIN A0
#define TOUCH_SENSOR_PIN 2

#define SERVO_PIN 9
//#define SERVO_OPEN 1750
#define SERVO_OPEN 1650
#define SERVO_SAFE_MIDDLE 1000
#define SERVO_CLOSED 775

#define RED 0
#define GREEN 1
#define BLUE 2

float currentRGB[] = {0, 0, 0};
float changeRGB[] = {0, 0, 0};
byte newRGB[] = {0, 0, 0};

#define MODE_SLEEPING 0
#define MODE_BLOOM 3
#define MODE_BLOOMING 4
#define MODE_BLOOMED 5
#define MODE_FADE 6
#define MODE_FADING 7
#define MODE_FADED 8
#define MODE_FALLINGASLEEP 9

#define MODE_RAINBOW 90

byte mode = MODE_FADED;

byte petalPins[] = {3, 4, 5, 6, 10, 11};

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(7, NEOPIXEL_PIN, NEO_GRB + NEO_KHZ400);
Adafruit_TiCoServo servo;

int servoChange = 1; // open
int servoPosition = SERVO_SAFE_MIDDLE;

void setup() {
  Serial.begin(115200);
  pixels.begin();
  servo.attach(SERVO_PIN, SERVO_CLOSED, SERVO_OPEN);

  pinMode(TOUCH_SENSOR_PIN, INPUT);
  attachInterrupt(digitalPinToInterrupt(TOUCH_SENSOR_PIN), _touchISR, RISING);

  randomSeed(analogRead(A7));
  SoftPWMBegin();

  pixelsUnifiedColor(pixels.Color(0, 0, 0));
  //pixelsUnifiedColor(pixels.Color(255, 70, 0));

  prepareCrossFade(140, 70, 0, 140);
  servo.write(servoPosition);
}

int counter = 0;
byte speed = 15;

void loop() {
  boolean done = true;
  switch (mode) {
    case MODE_BLOOM:
      prepareCrossFadeBloom(500);
      changeMode(MODE_BLOOMING);
      break;

    case MODE_BLOOMING:
      done = crossFade() && done;
      done = openPetals() && done;
      done = petalsBloom(counter) && done;
      if (done) {
        changeMode(MODE_BLOOMED);
      }
      break;

    case MODE_FADE:
      //prepareCrossFade(0, 0, 0, 800);
      changeMode(MODE_FADING);
      break;

    case MODE_FADING:
      done = crossFade() && done;
      done = closePetals() && done;
      done = petalsFade(counter) && done;
      if (done) {
        changeMode(MODE_FADED);
      }
      break;

    case MODE_FADED:
      //prepareCrossFade(140, 70, 0, 140);
      changeMode(MODE_FALLINGASLEEP);
      break;

    case MODE_FALLINGASLEEP:
      done = crossFade() && done;
      done = closePetals() && done;
      if (done) {
        changeMode(MODE_SLEEPING);
      }
      break;

    case MODE_RAINBOW:
      rainbow(counter);
      break;
  }

  counter++;
  delay(speed);
}

void changeMode(byte newMode) {
  if (mode != newMode) {
    mode = newMode;
    counter = 0;
  }
}

void _touchISR() {
  if (mode == MODE_SLEEPING) {
    changeMode(MODE_BLOOM);
  }
  else if (mode == MODE_BLOOMED) {
    changeMode(MODE_FADE);
  }
}

// petals animations

boolean petalsBloom(int j) {
  if (j < 250) {
    return false; // delay
  }
  if (j > 750) {
    return true;
  }
  int val = (j - 250) / 2;
  for (int i = 0; i < 6; i++) {
    SoftPWMSet(petalPins[i], val);
  }
  return false;
}

boolean petalsFade(int j) {
  if (j > 510) {
    return true;
  }
  for (int i = 0; i < 6; i++) {
    SoftPWMSet(petalPins[i], (510 - j) / 2);
  }
  return false;
}

// animations

void prepareCrossFadeBloom(unsigned int duration) {
  byte color = random(0, 5);
  switch (color) {
    case 0: // white
      prepareCrossFade(140, 140, 140, duration);
      break;
    case 1: // red
      prepareCrossFade(140, 5, 0, duration);
      break;
    case 2: // blue
      prepareCrossFade(30, 70, 170, duration);
      break;
    case 3: // pink
      prepareCrossFade(140, 0, 70, duration);
      break;
    case 4: // orange
      prepareCrossFade(255, 70, 0, duration);
      break;
  }
}

void rainbow(int j) {
  uint16_t i;
  byte num = pixels.numPixels() - 1;
  pixels.setPixelColor(pixels.numPixels() - 1, 100, 100, 100);

  for (i = 0; i < num; i++) {
    pixels.setPixelColor(i, colorWheel(((i * 256 / num) + j) & 255));
  }
  pixels.show();
}

// servo function

boolean openPetals() {
  if (servoPosition >= SERVO_OPEN) {
    return true;
  }
  servoPosition ++;
  servo.write(servoPosition);
  return false;
}

boolean closePetals() {
  if (servoPosition <= SERVO_CLOSED) {
    return true;
  }
  servoPosition --;
  servo.write(servoPosition);
  return false;
}

// utility function

void pixelsUnifiedColor(uint32_t color) {
  for (unsigned int i = 0; i < pixels.numPixels(); i++) {
    pixels.setPixelColor(i, color);
  }
  pixels.show();
}

void prepareCrossFade(byte red, byte green, byte blue, unsigned int duration) {
  float rchange = red - currentRGB[RED];
  float gchange = green - currentRGB[GREEN];
  float bchange = blue - currentRGB[BLUE];

  changeRGB[RED] = rchange / (float) duration;
  changeRGB[GREEN] = gchange / (float) duration;
  changeRGB[BLUE] = bchange / (float) duration;

  newRGB[RED] = red;
  newRGB[GREEN] = green;
  newRGB[BLUE] = blue;

  Serial.print(newRGB[RED]);
  Serial.print(" ");
  Serial.print(newRGB[GREEN]);
  Serial.print(" ");
  Serial.print(newRGB[BLUE]);
  Serial.print(" (");
  Serial.print(changeRGB[RED]);
  Serial.print(" ");
  Serial.print(changeRGB[GREEN]);
  Serial.print(" ");
  Serial.print(changeRGB[BLUE]);
  Serial.println(")");
}

boolean crossFade() {
  if (currentRGB[RED] == newRGB[RED] && currentRGB[GREEN] == newRGB[GREEN] && currentRGB[BLUE] == newRGB[BLUE]) {
    return true;
  }
  for (byte i = 0; i < 3; i++) {
    if (changeRGB[i] > 0 && currentRGB[i] < newRGB[i]) {
      currentRGB[i] = currentRGB[i] + changeRGB[i];
    }
    else if (changeRGB[i] < 0 && currentRGB[i] > newRGB[i]) {
      currentRGB[i] = currentRGB[i] + changeRGB[i];
    }
    else {
      currentRGB[i] = newRGB[i];
    }
  }
  pixelsUnifiedColor(pixels.Color(currentRGB[RED], currentRGB[GREEN], currentRGB[BLUE]));
  /*
    Serial.print(currentRGB[RED]);
    Serial.print(" ");
    Serial.print(currentRGB[GREEN]);
    Serial.print(" ");
    Serial.print(currentRGB[BLUE]);
    Serial.println();
  */
  return false;
}

uint32_t colorWheel(byte wheelPos) {
  // Input a value 0 to 255 to get a color value.
  // The colours are a transition r - g - b - back to r.
  wheelPos = 255 - wheelPos;
  if (wheelPos < 85) {
    return pixels.Color(255 - wheelPos * 3, 0, wheelPos * 3);
  }
  if (wheelPos < 170) {
    wheelPos -= 85;
    return pixels.Color(0, wheelPos * 3, 255 - wheelPos * 3);
  }
  wheelPos -= 170;
  return pixels.Color(wheelPos * 3, 255 - wheelPos * 3, 0);
}
Credits

【有奖直播课】鸿蒙驱动框架调试总结——火热报名中!

鸿蒙系统的驱动框架被称为HDF(HarmonyOS Driver Foundation),包括驱动加载,驱动服务管理和驱动消息机制。

HDF的驱动加载机制,包括按需加载和按序加载。按需加载的意思是可以配置启动的过程中哪些驱动加载,哪些驱动不加载;按序加载,就是按照优先级的顺序加载。

驱动服务管理是指驱动程序是不是可以被使用,如果可以被使用,是只能被用户态使用,还是只能被内核态使用,还是两个同时可以被使用。上面两项机制可以通过hcs格式的配置文件来实现,相对来说比较简单。

驱动服务的消息机制是指如何在用户态程序和内核态程序之间进行通信,包括用户态应用发送信息到驱动程序和用户态程序接收驱动主动上报事件。

2020年12月10日(本周四)晚20:00,我将为大家做一场鸿蒙驱动框架开发讲解的直播,主题是《HarmonyOS鸿蒙驱动框架调试总结》。主要探讨的是消息机制,大体的过程如下图所示,供大家参考。

在此次直播中,我会给大家展示鸿蒙驱动框架的基本结构以及如何进行驱动的开发。

主要内容包括如何进行内核态驱动程序的编写,如何把内核态驱动程序添加到系统中去,

如何进行用户态程序的编写,以及如何编译、下载。

最后,我们会根据根据程序运行结果来验证我们编写的驱动程序。

直播结束后,我会将相关代码提供给大家,一起交流学习。

>>>点击免费报名<<<

课程大纲:

1、鸿蒙系统简介以及鸿蒙相关开发资料网站介绍

2、张飞实战电子南极洲开发板介绍

3、鸿蒙驱动框架介绍

4、编写内核驱动程序样例

5、把驱动源码放入内核

6、编写用户态程序APP

7、编译、烧写、调试

讲师介绍:

张角——嵌入式研发工程师 张飞实战电子鸿蒙系统、嵌入式实时操作系统以及Risc-V单片机课程主讲老师。 专注单片机程序开发,鸿蒙系统驱动及应用开发,linux系统驱动及应用开发,同时对硬件电路设计,开关电源设计以及电机驱动设计有浓厚的兴趣。

直播抽奖:

免费报名+到会看直播,赢取HarmonyOS官方联名T恤、HarmonyOS官方开发板(HiSpark Wi-Fi IoT 智能家居套件) (中奖用户所填写收件人姓名、电话、地址需为真实信息,信息仅用于工作人员联系用户发放奖品。)

适合人群:

对鸿蒙系统开发感兴趣的学生、工程师以及其他相关人员  

>>>点击免费报名<<<

将树莓派打造成RFID和NFC的识别装置

用华为和苹果的朋友,应该知道自己的手机上基本都带NFC支付功能。

实际上NFC相关的场景不只是支付,还涵盖我们生活中的方方面面。比如IoT前哨站之前发过的一篇:DIY带数据的NFC“袖扣”

NFC(近场通信)基于RFID(射频识别)标准,两者都允许设备从被动令牌或电子标签接收数据(这意味着它不需要外部电源即可工作)。

市场上有现成的RFID和NFC识别设备出售,但可定制化程度不高。不过熟悉树莓派的朋友,可以凭借WaveShare的RFID/NFC扩展板,DIY一个更极客的识别装置。

和树莓派适配后的成品

开始之前,你需要一个能跑Raspberry Pi OS Lite(Buster)的树莓派,还有一个WaveShare NFC扩展板(大约人民币几十块)。

登录系统后,先更新系统。

sudo apt -y update && sudo apt -y upgrade

启用串行接口

该扩展版能够通过三个不同的接口进行通信:I2C,SPI和UART。

我们这里使用UART,因为它演示起来最简单。首先运行sudo raspi-config,进入“接口选项”,然后选择“串行接口”。

当系统询问你是否要登录控制台时,请选择“否”。当询问你是否要启用串行接口时,请选择“是”。

你需要立即重启,这将允许WaveShare HAT通过串行接口与我们的Raspberry Pi对话。

Waveshare HAT包含许多设置。请务必阅读说明!

配置并安装扩展板

如上所述,我们可以通过更改扩展板本身的某些物理开关来选择不同的接口。默认情况下,我们可以将其配置为UART / Serial,但具体接法最好到以下网址核对:

https://www.waveshare.com/wiki/PN532_NFC_HAT#Raspberry_Pi_examples

一般I1和I0处的跳线均应短接“ L”,D16和D20应短接,在DIP开关上,除RX和TX外,所有其他器件均应关闭。

仔细检查,然后将板子插到树莓派GPIO口上,启动。

然后执行如下命令:

sudo apt install rpi.gpio p7zip-full python3-pip
pip3 install spidev pyserial

wget https://www.waveshare.com/w/upload/6/67/Pn532-nfc-hat-code.7z
7z x Pn532-nfc-hat-code.7z

在尝试任何操作之前,需要编辑示例文件,以便我们使用UART。请根据自身要求将其注释或启用。

cd ~/raspberrypi/python
nano example_get_uid.py

pn532 = PN532_UART(debug=False, reset=20)

拿RFID令牌来测试一下

试试看!

如下所示启动示例代码:
python3 example_get_uid.py

如果一切顺利,屏幕将会显示与扩展板连接的信息。

现在,你可以将RFID令牌放在标有“ NFC”的HAT区域上。十六进制数字会开始在屏幕上滚动。这意味着,你的令牌已被检测到!

每个RFID令牌都有唯一的编号,因此可以用来标识不同人员的身份。

但是,该扩展板的功能远不止于此,因为它还支持NFC,并且可以与MIFARE Classic等通用标准进行通信,该标准允许卡上存储1kB的存储空间。

对应的example_dump_mifare.py文件在同一目录中(请确保你已正确设置串行连接)。

更进一步

现在,你可以读取RFID和NFC令牌上的唯一标识符了。

如前所述,如果你用的是MIFARE或NTAG2标准,还可以将数据写到卡上。

examples文件夹包含一些C程序,你可以试一下。

在卡上读取和写入少量数据,可以产生一些有趣的项目。在2018年的电磁场节上,整个游戏都是基于查找物理位置并使用MIFARE卡注册玩家的存在来进行的。

智能手机还可以使用NFC交换任何形式的数据,以及更多可能。

来自:Raspberrypi.org

编译:王文文

用树莓派和Lobe-python做智能垃圾分类

国外一个名叫Jen Fox的创客分享了一个由Raspberry Pi驱动的垃圾分类设备,该设备能告诉我们,当前的垃圾是可回收的,可堆肥的,还是有害的。

这个项目对初学者很友好,因为你不需要任何代码来训练机器学习模型,只需要稍微花点时间就可以将其加载到Raspberry Pi上。

这也是一个相当经济的装置,包括Raspberry Pi 4在内,价格不到70美元。

硬件:

Raspberry Pi 4B
树莓派摄像头模块
Adafruit 按钮
Adafruit LED

软件:

免编码的机器学习模型是用Lobe创建的,这是一个免费的桌面应用程序,可根据显示的对象自动训练图像分类器。

图像分类器认出了瓶盖

训练图像分类器:

基本上,你要上传一大堆的图片,然后告诉Lobe(分类程序)每一张图片显示的是什么对象。

比如哪些图片是可堆肥垃圾,哪些是可回收利用的物品,哪些是对生物有害的垃圾。当然,正如Jen所说,“你拥有的图片越多,模型识别起来越准确。”

接好摄像头模块的树莓派4B

你只需要编写少量代码就可以将图像分类器加载到树莓派上。Raspberry Pi摄像头充当图像分类器的“眼睛”,因此树莓派可以认出你要区分的垃圾种类。

将按钮和LED连接到Raspberry Pi的GPIO引脚,让它们与摄像头一起工作,并根据图像分类器识别“看到”的内容,点亮相应的LED。

将按钮和LED连接到GPIO引脚的示意图

当然,你要先找个盒子,最好可以安在墙上。

然后在纸板箱上钻一个方形的孔,以确保摄像头可以“看到”垃圾。

再钻几个孔,以便用户能看到LED灯,并可以接触按钮。

记得为Raspberry Pi的电源留出空间,以便接线。

Jen把盒子装在墙上,开始识别一个塑料袋

该项目源码地址:

https://github.com/IoToutpost/TrashClassifier

来自:Raspberrypi.org

编译:王文文

【鸿蒙直播】从零开发鸿蒙小游戏App

2020年11月4日(周三,晚20:00),我将为大家做一场鸿蒙App开发的直播,主题是《从零开发鸿蒙小游戏App》。我会从零开始手把手地带领大家开发一款运行在鸿蒙设备上的、曾经风靡全球的小游戏。我会对编写的每一行代码进行讲解。我们采用边做边学的方式,在做中学,在学中做,在直播过程中完成一个小游戏App的所有功能。

>>>点击免费报名<<<

讲师介绍:

就目前而言,鸿蒙App开发可用的平台有三个:智慧屏、智能手表、运动手表。

如果我们开发的是智慧屏或智能手表上的App,那么目前华为还没有开放基于X86的本机模拟器,因此,需要将编写的代码发送到远程的ARM处理器以运行代码,在本机上只能预览运行结果,而无法在本机上运行和调试代码。

如果我们开发的是运动手表上的App,那么既可以使用本机的预览器Previewer来预览代码的运行效果,也可以使用本机的模拟器simulator来运行和调试代码。在运动手表这个平台上,相关的设备和开发工具是最成熟、最完善的,给开发者的体验已经很棒了!

本次直播主要是在运动手表上使用JavaScript编程语言完成项目的编写,直播后会尽快将Java版的项目代码共享给大家。

学习有礼:

参加HarmonyOS公开课,抽官方定制周边! 

官方定制T恤等你来拿!还有机会赢取HarmonyOS官方开发板(HiSpark Wi-Fi IoT 智能家居套件)

直播前导课程:https://edu.51cto.com/course/25054.html

鸿蒙运动手表呼吸训练项目源代码下载:https://harmonyos.51cto.com/posts/1076

轻松掌握鸿蒙开发板外设

业界普遍认为物联网将是下一个爆点,生态圈会有上千亿美金的市场,而鸿蒙应该会成为这个市场的主角。

liteos-a是为物联网造出的一个轻量级内核,设计精巧,支持MMU,支持内核/APP空间隔离。支持POSIX接口,使得大量开源软件能够在liteos-a上直接使用,启动速度非常快。

10.28 晚8:00,我们将举办一场直播公开课,主题为《轻松掌握鸿蒙开发板外设控制》,这次我们主要基于liteos-a内核进行讲解。
本次直播的目的是让大家能够基于开发板快速上手鸿蒙操作系统,通过几个小案例让你快速轻松的上手鸿蒙设备开发。在直播间,老师会为你答疑解惑,以及如何基于已有的知识快速学习新的系统开发技能。

# >>>戳我报名<<<

你是否有这样的困惑?
1、想学习鸿蒙却不知从何学起?
2、理论知识扎实却不知如何上手操作?
3、学习中的疑问无从获得解答?
4、独自学习无人讨论?

放心,你的这些困惑,来直播间,帮你逐一解决。

课程亮点:
1、专业讲师 讲解+演示+答疑
2、结合案例具体讲解
3、快速上手鸿蒙设备开发
4、专业指导,不走弯路

直播课程大纲:

  1. Hi3861开发框架简介
  2. LED灯控制示例(案例讲解)
  3. 按键事件响应(案例讲解)
  4. 蜂鸣器控制示例(案例讲解)

适合人群:
学生、软件工程师、硬件爱好者

讲师介绍:
唐佐林-狄泰软件学院创始人

1.2005年毕业于东南大学计算机科学与工程系,同年保送南京理工大学模式识别与智能系统重点实验室学习计算机视觉。
2.2007年获取硕士学位(研究成果已申请专利,《全天时结构化道路多行道线检测方法》,公开号:CN101469991)
3.同年加入摩托罗拉中国研发中心南京分公司,担任CDMA手机研发工程师,负责摩托罗拉CDMA系列手机UI库的开发与设计,以及显示屏驱动的开发
4.2009年转入摩托罗拉中国研发中心成都分公司,担任Digital Radio对讲机研发工程师,负责蓝牙协议栈以及蓝牙驱动的开发
5.2010年凭借优秀的开发能力组建并加入摩托罗拉Diagnostic Tools Team
6.2013年正式成为摩托罗拉Diagnostic Tools Team软件架构师,负责所有诊断工具软件的架构,设计与开发
7.2016年离开摩托罗拉中国研发中心,全职进行课程研发,技术分享

学习有礼:
扫码免费报名+到会看直播,抽官方定制周边!
官方定制T恤等你来拿!还有机会赢取HarmonyOS官方开发板

树莓派计算模块CM4上市,最低单价25美元

树莓派基金会近日发布了第四代树莓派计算模块 —— Raspberry Pi Compute Module 4。

共有 32 个具体型号,售价从 25 美元起。最低配置 1GB RAM/Lite/无无线版本,最高配置 8GB RAM/32GB Flash/无线增强版,90 美元。对应着 4 种不同内存和是否有无线通讯功能。

CM4 核心模块配置如下:

1.5GHz 4 核心 64-bit ARM Cortex-A72 CPU
VideoCore VI 图形,支持 OpenGL ES 3.x
H.265 (HEVC) 4Kp60 视频硬解码
H.264 (AVC) 视频 1080p60 硬解码和 1080p30 硬编码
双 HDMI 接口分辨率高达 4K
单通道 PCI Express 2.0 接口
双 MIPI DSI 显示器和双 MIPI CSI-2 摄像头接口
1GB, 2GB, 4GB 或 8GB LPDDR4-3200 SDRAM
可选 8GB, 16GB 或 32GB eMMC Flash 存储
可选 2.4GHz 和 5GHz IEEE 802.11b/g/n/ac 无线网卡和蓝牙 5.0
支持 IEEE 1588 的千兆以太网 PHY
28 个 GPIO 引脚,6 个 UART、6 个 I2C 和 5 个 SPI

详细价格表:


为配合计算模块核心使用,官方推出了一款新的 IO 板。

配置如下:

两个全尺寸 HDMI 接口
千兆以太网接口
两个 USB 2.0 接口
MicroSD 卡插槽(仅 Lite 有)
PCI Express Gen 2 x1 插槽
带有 40 针脚的 GPIO 接口
12V 输入接口(如果不使用 PCIe,可支持最高 26V)
摄像头和显示器 FPC 接口
实时时钟

IO 板的官方定价为 35 美元。

这是迄今为止性能最强的树莓派计算模块,性能远超之前的树莓派 CM3+。基金会表示每年销售的 700 万个树莓派产品中,有超过一半的产品被用于工业和商业应用。