openSUSE:JoyPi

跳转到:导航搜索

JoyPi 是一个基于 Raspberry Pi 3B/3B+/4B 的实验性外壳。更多信息请参见 https://joy-it.net/en/products/rb-joypi

您可以下载

特性

  • 显示屏:7" 触摸屏显示屏(分辨率:1024x600),8x8 LED 矩阵,16x2 LED 模块,4 位段显示屏
  • 摄像头:2MP USB 摄像头
  • 传感器:光传感器、声音传感器、运动传感器、超声波传感器、倾斜传感器、红外传感器、触摸传感器、DHT11 温度和湿度传感器、RFID 模块、倾斜传感器
  • 按钮:可编程 4x4 按钮矩阵、4 个独立按钮、16 个开关
  • 电机:舵机控制、舵机、步进电机
  • 其他模块:GPIO LED 指示灯、面包板、振动单元、蜂鸣器、继电器
  • 配件:迷你键盘和 USB 接收器、电源、GPIO 电缆、microSD 卡、RFID 芯片、RFID 卡、USB 电缆、遥控器、RPI 4B 的微型 HDMI 适配器

设置

硬件设置

请按照 简短手册中的说明 正确安装硬件。


软件设置

您可以根据系统上使用的板子,使用任何可启动的 openSUSE 镜像来启动 RPi3RPi4

我建议使用 XFCE 镜像作为基础。然后,您可以

  • 添加非 root 用户:以 root/linux 身份登录,并启动 yast2 users 以添加新用户。您可以将一些组添加到此用户:video、dialout
  • 通过遵循 openSUSE:I2C#Load_i2c-dev_kernel_module 启用 I2C 访问,并通过将以下行添加到 /boot/efi/extraconfig.txt 启用 i2c-1 访问
# Enable I2C access from Linux
dtparam=i2c_arm=on
# Uncomment following line to set i2c-1 baudrate to 400 000 Hz (default i2c-1 baudrate is 100 000 Hz)
# dtparam=i2c_arm_baudrate=400000
# Enable SPI access from Linux
dtparam=spi=on
  • 安装一些有用的工具
sudo zypper in fswebcam libgpiod i2c-tools spi-tools htop v4l-tools v4l-utils vlc python3-gpiod python3-smbus python3-spidev git
git clone https://github.com/ggardet/joypi

设备

7" 触摸屏

启动 openSUSE 镜像后,将使用 7" 屏幕。无需进行任何配置。在 openSUSE 启动后,您可以像使用鼠标一样使用触摸屏。

USB 摄像头

使用 v4l2-ctl --all 检查是否检测到 USB 2.0 PC Camera: PC Camera

您可以使用以下命令拍摄 1280x1024 图片

 fswebcam -r 1280x1024 --no-banner image1.jpeg

 streamer -s 1280x1024 -f jpeg -o image2.jpeg

或者,使用 vlc,单击 媒体 > 打开捕获设备...,在 视频设备名称 中选择 /dev/video0,然后单击 播放

GPIO/LED

对于 40-pin 连接器 的大多数引脚,您都有一个 LED 来显示输出的当前状态。

您可以使用以下命令打开 pin7 (gpio4) 的 LED 3 秒

 gpioset -m time -s 3 -l  gpiochip0 4=1

有关更多详细信息,请参阅 openSUSE:GPIO

触摸传感器:pin11 (gpio17)

触摸传感器位于 pin11 (gpio17)。获取输入值(0 表示未触摸,1 表示正在触摸)

 gpioget gpiochip0 17


蜂鸣器:pin12 (gpio18)

蜂鸣器位于 pin12 (gpio18)。使用以下命令蜂鸣 1 秒

 gpioset -m time -s 1 gpiochip0 18=1

红外接收器:pin38 (gpio20)

您必须按照硬件手册中的说明插接红外接收器。在关闭外壳之前,您需要将其移除。
对于 Raspberry Pi,您需要将以下行添加到 /boot/efi/extraconfig.txt

 # Enable IR receiver on gpio20
 dtoverlay=gpio-ir,gpio_pin=20
CONFIG_IR_GPIO_CIR 最近已添加到 openSUSE 内核配置中,因此请更新您的内核以确保其正常工作。它应该被内核检测为 rc0 设备

您可以通过按下套件中提供的红外遥控器上的某些按键并检查连接到 pin38 (gpio22) 的 LED 在您按下按键时是否闪烁来检查您的硬件是否正确设置。

继电器:pin40 (gpio21)

继电器位于 pin40 (gpio21)。使用以下命令打开继电器 10 秒

 gpioset -m time -s 10 -l  gpiochip0 21=1

倾斜传感器:pin15 (gpio22)

倾斜传感器允许我们检测向右或向左的倾斜。
倾斜传感器位于 pin15 (gpio22),但您需要打开右侧 DIP 开关上的开关 2,将其他开关设置为 OFF。读取传感器返回的值(0 表示向右倾斜,1 表示向左倾斜)

 gpioget gpiochip0 22


运动传感器:pin16 (gpio23)

运动传感器位于 pin16 (gpio23)。读取传感器返回的值(0 表示未检测到任何东西,1 表示传感器前方有东西移动)

 gpioget gpiochip0 23

可以使用螺丝刀通过 MOTION 区域附近的透明盖上的电位器 R125 调整灵敏度。

振动器:pin13 (gpio27)

振动器位于 pin13 (gpio27)。使用以下命令打开振动器 4 秒

 gpioset -m time -s 4 gpiochip0 27=1

步进电机:pins 29,31,33,35 (gpio 5, 6, 13, 16)

步进电机是 28BYJ-48 5VDC。为了使用它,您需要将正确的 DIP 开关 3-6 设置为 ON,其他开关设置为 OFF。

要移动转子,您需要按照以下步骤操作。完成第 8 步后,循环到第 1 步。
如果您想朝相反方向转动,只需倒退(从第 8 步到第 1 步)。


引脚 / GPIO 初始化 第 1 步 第 2 步 第 3 步 第 4 步 第 5 步 第 6 步 第 7 步 第 8 步
A / gpio5 0 0 0 0 0 0 1 1 1
B / gpio6 0 0 0 0 1 1 1 0 0
C / gpio13 0 0 1 1 1 0 0 0 0
D / gpio19 0 1 1 0 0 0 0 0 1

您需要移动 512 步才能完成 360°(一圈)。

7 段显示屏

7 段显示屏由 HT16K33 (数据表) 在 i2c-1 总线上,地址为 0x70 驱动。

  • 第一个数字(从左边开始)由寄存器 0x00 定义
  • 第二个数字(从左边开始)由寄存器 0x02 定义
  • 两个点(小时和分钟分隔符)由寄存器 0x04 定义(设置为 0x00(关闭)或 0x02(打开))
  • 第三个数字(从左边开始)由寄存器 0x06 定义
  • 第四个数字(从左边开始)由寄存器 0x08 定义

150px-7_Segment_Display_with_Labeled_Segments.svg.png

名称 DP G F E D C B A
7 6 5 4 3 2 1 0

对于每个数字,寄存器的值设置一个段。值为 0 将段设置为 ON,值为 1 将段设置为 OFF。
因此,如果您想显示一个 0,您需要将 A、B、C、D、E、F 设置为 ON,这将是二进制值 b0011_1111,即十六进制中的 0x3F。因此,对于第二个数字,它将是

 i2cset -y 1 0x70 0x02 0x3F


并且有特殊的寄存器来启用/禁用 7 段显示屏并使其闪烁。

  • 启用显示(不闪烁):写入特殊命令 0x81
 i2cset -y 1 0x70 0x81
  • 禁用:写入特殊命令 0x80
 i2cset -y 1 0x70 0x80
  • 闪烁
    • 2 Hz:写入特殊命令 0x83
 i2cset -y 1 0x70 0x83
    • 1 Hz:写入特殊命令 0x85
 i2cset -y 1 0x70 0x85
    • 0.5 Hz:写入特殊命令 0x87
 i2cset -y 1 0x70 0x87

RFID-RC522 (SPI0.0)

待办事项

有关 SPI 的更多信息,请参阅 openSUSE:SPI

8x8 LED 矩阵 (SPI0.1)

8x8 LED 矩阵由 MAX7219 (数据表) 驱动,连接到 SPI0.1(总线 0,片选 1),最大运行速度为 10 MHz。

通过切换所有 LED(测试模式)测试显示

 echo -n -e "\x0F\x01" | spi-pipe -d /dev/spidev0.1 -s 10000000 | xxd

并切换回正常模式

 echo -n -e "\x0F\x00" | spi-pipe -d /dev/spidev0.1 -s 10000000 | xxd

LED 矩阵操作初始化

 echo -n -e "\x0C\x01" | spi-pipe -d /dev/spidev0.1 -s 10000000 | xxd    # Normal operation
 echo -n -e "\x09\x00" | spi-pipe -d /dev/spidev0.1 -s 10000000 | xxd    # No decoding
 echo -n -e "\x0A\x0F" | spi-pipe -d /dev/spidev0.1 -s 10000000 | xxd    # Intensity: max 0x0F
 echo -n -e "\x0B\x07" | spi-pipe -d /dev/spidev0.1 -s 10000000 | xxd    # Make use of all leds
 # Switch off all leds
 echo -n -e "\x01\x00" | spi-pipe -d /dev/spidev0.1 -s 10000000 | xxd    # Row 1
 echo -n -e "\x02\x00" | spi-pipe -d /dev/spidev0.1 -s 10000000 | xxd    # Row 2
 echo -n -e "\x07\x00" | spi-pipe -d /dev/spidev0.1 -s 10000000 | xxd    # Row 3
 echo -n -e "\x04\x00" | spi-pipe -d /dev/spidev0.1 -s 10000000 | xxd    # Row 4
 echo -n -e "\x05\x00" | spi-pipe -d /dev/spidev0.1 -s 10000000 | xxd    # Row 5
 echo -n -e "\x06\x00" | spi-pipe -d /dev/spidev0.1 -s 10000000 | xxd    # Row 6
 echo -n -e "\x07\x00" | spi-pipe -d /dev/spidev0.1 -s 10000000 | xxd    # Row 7
 echo -n -e "\x08\x00" | spi-pipe -d /dev/spidev0.1 -s 10000000 | xxd    # Row 8

现在您可以设置每一行的每个 LED。要设置第一行的最后 4 个 LED

 echo -n -e "\x01\x0F" | spi-pipe -d /dev/spidev0.1 -s 10000000 | xxd

要设置第二行的前 4 个 LED

 echo -n -e "\x02\xF0" | spi-pipe -d /dev/spidev0.1 -s 10000000 | xxd


还有一个 Python 脚本演示如何在 Python 中使用它:https://github.com/ggardet/joypi/blob/master/joypi_led_matrix.py
您需要 python3-spidev 包。


有关 SPI 的更多信息,请参阅 openSUSE:SPI

LCD 16x2 (i2c-1 0x21)

16x2 LCD 位于 i2c-1 总线上,地址为 0x21。它似乎类似于 I2C 16x2 Arduino LCD 显示模块,并且似乎由 MCP23008 驱动,具有以下连接

PCA8574 引脚 P7(输入/输出) P6(输入/输出) P5(输入/输出) P4(输入/输出) P3(输出) P2(输出) P1(输出) P0(输出)
LCD 引脚(4 位模式) B7 B6 B5 B4 BT(背光) E R/W RS


将 LCD 的所有 gpio 设置为输出

 i2cset -y 1 0x21 0x00 0x00

将 BT 设置为 1 以启用背光

 i2cset -y 1 0x21 0x09 0x80

将 BT 设置为 0 以禁用背光

 i2cset -y 1 0x21 0x09 0x00
TODO:如何初始化 LCD 为 4 位并显示内容

有关 I2C 的更多信息,请参阅 openSUSE:I2C

光传感器 (i2c-1 0x5C)

i2c 光传感器位于 i2c-1,地址为 0x5C。它似乎是 Rohm BH1750FVI (数据表)。您可以使用以下命令从寄存器 0x20 获取原始值

 i2cget -y 1 0x5c 0x20 w

要获得可读的 lux 值,您需要执行以下操作:(高字节 + 256 * 低字节) / 1.2。因此,如果您获得

 0x9c00

0x9c 是十进制的 156,0x00 是十进制的 0。因此,您有 (156 + 256*0)/1.2 = 130 lx

还有一个 Python 脚本可以直接打印 lx 值:https://github.com/ggardet/joypi/blob/master/joypi_light_sensor.py
您需要 python3-smbus 包。

有关 I2C 的更多信息,请参阅 openSUSE:I2C

温度和湿度传感器 (1-wire on gpio4, pin7)

在您的 /boot/efi/extraconfig.txt 文件中,您需要添加以下行以在启动时启用 1-wire 接口(在 gpio4 上)

 # Enable 1-wire interface on gpio4
 dtoverlay=w1-gpio

重新启动后,检查 /sys/bus/w1/devices/ 是否有 w1_bus_master1,以及可能还有从设备。

TODO:解释如何在 openSUSE 内核中启用 DHT11 驱动程序后读取传感器值

有关 1-wire 接口的更多信息,请参阅 openSUSE:1-wire

参见