树莓派音频口底噪消除的方法

树莓派板载的 3.5MM 音频输出口直接输出时会有底噪。一直以为是硬件的问题,而实际上只需要在配置文件中添加一行代码就可以消除。

编辑 /boot/config.txt,可以直接把 SD 卡放在电脑上修改也可以直接在树莓派上用 nano 命令

sudo nano /boot/config.txt

在文本最末尾加入一行:

audio_pwm_mode = 2

保存并重启树莓派。

可能还会有轻微底噪,如还是无法接受,建议更换高级电源,或者直接使用 HiFi 声卡扩展板。

扩展阅读《配置树莓派的音频输出:3.5MM/HDMI》。

ref

树莓派 Compute Module 3+ 发售

近日,树莓派(Raspberry Pi)基金会宣布 Raspberry Pi Compute Module 3+ 发售。

CM3+ 是 CM3 和 CM1 的进化版,带来了新功能,同时保持了原有的外形、兼容性、价格和一贯的易用性。

那么 CM3+ 有哪些不一样呢?

采用了树莓派3B+一样改进的散热设计和 Broadcom BCM2837B0 处理器,可以看成是 CM3 的直接替代品。由于电源限制,最大处理速度保持在 1.2GHz,而树莓派3B+则为1.4GHz。

CM3+ 提供三种不同的 eMMC 闪存容量,以及 Lite 精简版本。价格方面,精简版售价$25,8GB/16GB/32GB eMMC版分别售价$30,$35和$40。

同时发布的还有配套的 Compute Module 3+ 开发套件,该套件包含 Lite 和 32GB CM3+ 模块、计算模块IO板、摄像头、显示器适配器(CMCDA board)、跳线等。

该版本将长期供货至2026年。另外,CM1、CM3 和 CM3 Lite 已经不再被推荐用于新设计。

via

树莓派官方线下 Raspberry Pi 商店开张

Raspberry Pi 商店是线下体验和购买 Raspberry Pi 产品的地方,还提供一些线下商店专供的独家产品。目前商店没有开通线上购买通道,仅接受线下交易。

Raspberry Pi 创始人 Eben Upton 表示,这家实体店会让更多原本会错过他们的人们认识到更容易和更便宜地学习STEM技能的重要性。 他避免将其描述为商店,而是将其描述为“陈列室”。新的Raspberry Pi商店并不打算经营传统零售业务,而更像是一个创客空间。

新的 Raspberry Pi 商店将出售电脑以及各种配件。顾客还可以在货架上找到品牌商品,如马克杯和服装。但重点还是放在为游客提供学习电子设备和编程的机会。

即使它没有收支平衡,该实验仍然有价值,Raspberry Pi 基金会将其作为与新客户互动的实验室,允许它为更广泛的人群定制其产品。

很多人好奇为什么 Raspberry Pi 基金会决定在剑桥开设旗舰零售店,人口不到125000的城市但实际上,它确实有意义。剑桥显然因其世界领先的大学而闻名。除此之外,它还是一个富裕的中产阶级城市,它也是英国科技产业的核心,也是 ARM Holdings,Infose 等公司的所在地,也是美国以外最重要的微软研究机构之一。

营业时间

周一 9:00-18:00

周二 9:00-18:00

周三 9:00-20:00

周四 9:00-18:00

周五 9:00-18:00

周六 9:00-19:00

周日 11:00-17:00

位置在英国剑桥市中心 Grand Arcade 的一楼。

最常用的树莓派 Linux 命令及说明

对于 Linux 新手来说,使用 Raspbian 系统会遇到比较棘手的问题,其中之一就是对各种 Linux 命令的学习。下面树莓派实验室整理一份常用的 Linux 命令及说明,供初学者对照了解,后面我们也会逐步完善更新这个页面。

命令在哪里输入?

通过 SSH 客户端登录你的树莓派,或者进入树莓派的桌面运行终端程序,接下来就可以输入命令了。

什么是 sudo 命令?

在一行命令之前加上 sudo,表示以系统管理员身份执行这条命令。如果使用不当可能会造成事故,所以仅在特别需要使用管理员权限运行的时候添加。

sudo reboot

重启树莓派,需要管理员权限才可以执行,因此添加 sudo。

sudo poweroff

关机,需要管理员权限才可以执行。

sudo shutdown -h 03:14

定时关机,例如上面指令将设定关机时刻为凌晨3点14分。

sudo halt

关机。与 poweroff 不同的是,此命令会在关机前停止所有CPU功能。执行时,杀死应用进程、执行sync系统调用、文件系统写操作完成后就会停止内核。推荐使用这种方法关机。

clear

清除终端上的文字。

cd /folder1/folder2

进入到目录 /folder1/folder2。

cd ~

进入到当前用户的主目录。

ls -lha

列出当前位置的文件和目录,显示全部信息。如去掉后面的 -lha 则只列出文件名。

sudo find / -name file.txt

查找文件名为 file.txt 的文件。

sudo find / -name file.txt -type f

查找文件名为 file.txt 的文件,仅查找文件。

sudo find / -name somedir -type d

查找文件名为 file.txt 的文件,仅查找目录。

sudo find / -name file.*

查找文件名为 file.* 的文件,星号为通配符。

sudo mv ~/file /folder1/folder2/

将 ~/file 移动到 /folder1/folder2/。

man command

查看命令的使用手册。command 替换成你想了解的任何命令。

sudo raspi-config

打开树莓派功能配置界面。

sudo ifconfig -a

列出树莓派的网络配置信息。

ping 192.168.1.1

Ping 某个 IP。查看树莓派和这个 IP 的设备的连接状况。

sudo apt-get update

更新软件列表。

sudo apt-get upgrade

升级软件包。

修改树莓派的开机启动画面

树莓派修改开机界面主要分为三步:1. 屏蔽彩虹屏;2. 屏蔽开机滚动代码;3. 设置开机界面。

1. 屏蔽彩虹屏

彩虹屏即树莓派开机自检GPU,会在屏幕中央出现彩虹色的方块。

sudo nano /boot/config.txt

在config.txt中添加一行disable_splash=1,字面上的意思就是取消启动界面。

2. 屏蔽开机滚动代码

我们需要修改文件/boot/cmdline.txt

sudo nano /boot/cmdline.txt

将console=tty1修改成console=tty3(是将开机的滚动代码指向tty3,从而开机时的tty1没有代码。2016年9月以后的raspbian镜像tty1无需更改成tty3),并添加一句loglevel=3,修改后的文件如下:

dwc_otg.lpm_enable=0 console=tty3 console=ttyAMA0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait fbcon=map:10 fbcon=font:ProFont6x11 logo.nologo loglevel=3

3. 设置开机界面

首先安装 fbi

sudo apt-get install fbi

界面图片准备

就开机界面的图片的分辨率不要超过屏幕分辨率,格式为.png,重命名为splash.png,然后复制到/etc/目录下。

开机脚本

在/etc/init.d/目录下新建文件asplashscreen

sudo nano /etc/init.d/asplashscreen

在文件中输入:

#! /bin/sh ### BEGIN INIT INFO # Provides: asplashscreen # Required-Start: # Required-Stop: # Should-Start: # Default-Start: S # Default-Stop: # Short-Description: Show custom splashscreen # Description: Show custom splashscreen ### END INIT INFO do_start () { /usr/bin/fbi -T 1 -noverbose -a /etc/splash.png exit 0 } case “$1″ in start|””) do_start ;; restart|reload|force-reload) echo “Error: argument ‘$1’ not supported” >&2 exit 3 ;; stop) # No-op ;; status) exit 0 ;; *) echo “Usage: asplashscreen [start|stop]” >&2 exit 3 ;; esac :

然后使这个文件可执行,开机自动运行:

sudo chmod a+x /etc/init.d/asplashscreen sudo insserv /etc/init.d/asplashscreen reboot

最后在终端中输入reboot重启即可看见开机你设置的图片。

作者:BrillZhang

来源:blog.csdn.net/zyf2539/article/details/54178284

在树莓派上玩 Steam 游戏的方法

最近 Valve 公司发布了 Steam Link App,可以在移动设备上借助性能更强的机器来运行游戏,并同时将视频流传送到移动设备上。更棒的是 Steam Link (beta) 也支持树莓派!

Steam Link 的原理是利用 WiFi 网络,把电脑的画面串流到树莓派上,而树莓派上已连接的游戏手柄则可用于操作游戏。你可在其他地方用树莓派畅玩电脑内的 Steam 游戏。换句话说,玩家必须事先在 Steam 平台购买好游戏,并将之安装到电脑,树莓派只用作第二个画面显示用途及操作用途,游戏不会占据树莓派的储存空间。

你需要做的仅仅是运行Raspbian Stretch,按照以下方法安装Steam Link:

wget http://media.steampowered.com/steamlink/rpi/steamlink_1.0.5_armhf.deb sudo dpkg -i steamlink_1.0.5_armhf.deb

安装完成后,在命令行运行 steamlink,或者在桌面环境的游戏菜单里运行 Steam Link 均可。

对 Steam Link 的支持已经被添加到 RetroPie,下面是演示视频:

利用树莓派Zero远程可视化喂鱼

眼看要过年了,回老家之后,养的小鱼用不了几天就要见马克思,想着用朋友送的zero来做一个远程喂鱼的小东西,应该不难。

思路:利用双路继电器分别控制灯和水泵,使用mjpg-streamer来获取摄像头的视频流,并在特定的时刻自动开闭继电器。

网络环境:有公网IP的家庭网络,利用路由器的ddns或者花生壳,树莓派作为tcpserver对外提供访问。但这个条件,目前已经很难满足了,一般网络都是大内网,这种情况可以让树莓派作为tcpclient主动请求服务器获取指令,本文介绍的是第一种情况。

鱼食槽暂时未完成,准备搞两个大一点的瓶盖,合起来热熔胶伺候,中间放鱼食,边缘开两个孔,最终固定到步进电机上,转一圈就能完成喂鱼动作。

树莓派的安装和配置,本文不再赘述,本文分“硬件部分”、“软件部分”、“自启动配置”来说明整个项目。

硬件部分

本项目中使用的硬件:

必不可少的大脑:

1. 双路继电器

使用 gpio readall 指令来获取树莓派上的所有接口信息。

这里使用BCM方式来控制GPIO接口,选择BCM编号为18和27的插针,也就是GPIO1和GPIO2,作为两路继电器的信号控制,继电器的vcc和gnd,分别接到树莓派的5V和0V接口,先借个图,看起来清晰一点。

2. 步进电机及ULN2003控制模块

步进电机利用4步或8步脉冲信号来驱动电机转动,这里用双4步(ab bc cd da)来控制电机,可以获得比较强的扭矩,同时精度也比单4步要好,这个ULN2003控制模块有个缺点,就是控制间隔不能小于3ms,否则电机只震动,不转动。

连接也很简单,正负极接到zero上,控制脚使用BCM编号为23 24 25 12的针脚,BCM编号见第一张图。

3. 兼容的USB摄像头

直接扔到usb集线器上就完事了,树莓派上使用lsusb查看,如果没有,基本是不兼容导致的。

4. 兼容树莓派的USB无线网卡

5. USB集线器

软件部分

软件也是主要三大块:

1. 继电器控制、定时控制、步进电机控制 (代码文件保存到/home/pi/scripts/MyTcpControl.py)

2. 摄像头实时视频流部署 (启动视频流服务的脚本保存到/home/pi/scripts/startCamera.sh)

3. 安卓远程控制APP>

1. 双路继电器控制、自动定时控制、步进电机控制

本模块使用Python语言编写。

建立TCP服务器,通信端口为7654 高低电平控制

由于使用的继电器写低为接通电路,所以代码中,使用GPIO.LOW来接通继电器电路,GPIO.HIGH来关闭继电器电路。 电机步进序列控制。

步进电机使用双4步来控制GPIO的电平信号,具体为:

1,1,0,0 0,1,1,0 0,0,1,1 1,0,0,1

MyTcpControl.py完整代码如下

import sys import os import _thread import time import datetime from socket import * import RPi.GPIO as GPIO host = ‘0.0.0.0’ port = 7654 buffsize = 4096 ADDR = (host,port) channel1 = 18 channel2 = 27 IN1 = 23 IN2 = 24 IN3 = 25 IN4 = 12 lightManual = False pumpManual = False lightStatus = 0 pumpStatus = 0 def main(): GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(channel1,GPIO.OUT,initial=GPIO.HIGH) GPIO.setup(channel2,GPIO.OUT,initial=GPIO.HIGH) GPIO.setup(IN1,GPIO.OUT) GPIO.setup(IN2,GPIO.OUT) GPIO.setup(IN3,GPIO.OUT) GPIO.setup(IN4,GPIO.OUT) _thread.start_new_thread(autoControlLight, (“light”,1)) _thread.start_new_thread(autoControlPump, (“pump”,1)) server = socket(AF_INET,SOCK_STREAM) server.bind(ADDR) server.listen(10) print(“MyControl TcpServer is started”) while True: try: client,addr = server.accept() _thread.start_new_thread(onAccept, (client,addr)) except: print(‘Server is interrupted’) #server.close() #server.shutdown() def autoControlLight(tName,para): global lightManual global lightStatus while True: timeNow1 = datetime.datetime.now() h = timeNow1.hour m = timeNow1.minute if h==0 and m==0: lightManual = False if h==8 and m==0 and lightManual==False: GPIO.output(channel1,GPIO.LOW) lightStatus = 1 if h==17 and m==0: GPIO.output(channel1,GPIO.HIGH) lightStatus = 0 time.sleep(60) def autoControlPump(tName,para): global pumpManual global pumpStatus while True: timeNow2 = datetime.datetime.now() h = timeNow2.hour m = timeNow2.minute if h==0 and m==0: pumpManual = False if h==8 and m==0 and pumpManual==False: GPIO.output(channel2,GPIO.LOW) pumpStatus = 1 if h==17 and m==0: GPIO.output(channel2,GPIO.HIGH) pumpStatus = 0 time.sleep(30) def opDrive(): forwardDrive(0.008,512) stopDrive() def onAccept(sock, addr): recvData = sock.recv(buffsize).decode(‘gbk’) print(‘recvData:’+recvData) #print data retInfo=”” global lightManual global lightStatus global pumpManual global pumpStatus try: if recvData==”open_close”: retInfo = “opDrive success” sock.send(retInfo.encode(‘gbk’)) sock.close() opDrive() else: if recvData==”open1″: GPIO.output(channel1,GPIO.LOW) lightManual = True lightStatus = 1 retInfo = “light 1″ elif recvData==”close1”: GPIO.output(channel1,GPIO.HIGH) lightManual = True lightStatus = 0 retInfo = “light 0″ elif recvData==”open2”: GPIO.output(channel2,GPIO.LOW) pumpManual = True pumpStatus = 1 retInfo = “pump 1″ elif recvData==”close2”: GPIO.output(channel2,GPIO.HIGH) pumpManual = True pumpStatus = 0 retInfo = “pump 0″ elif recvData==”reboot”: os.system(“sudo reboot”) retInfo = “reboot success” elif recvData==”getStatus”: retInfo=str(lightStatus)+”,”+str(pumpStatus) elif recvData==”test”: retInfo=”test ok” sock.send(retInfo.encode(‘gbk’)) sock.close() except Exception as err: retInfo = str(err) sock.send(retInfo.encode(‘gbk’)) sock.close() def setStep(w1,w2,w3,w4): GPIO.output(IN1,w1) GPIO.output(IN2,w2) GPIO.output(IN3,w3) GPIO.output(IN4,w4) def stopDrive(): setStep(0,0,0,0) def forwardDrive(delay,steps): for i in range(0,steps): setStep(1,1,0,0) time.sleep(delay) setStep(0,1,1,0) time.sleep(delay) setStep(0,0,1,1) time.sleep(delay) setStep(1,0,0,1) time.sleep(delay) if __name__ == ‘__main__’: main()

2. 摄像头实时视频流部署

尝试了motion组件,发现巨卡,转而使用mjpg-streamer,很流畅,推荐使用!

(1)安装依赖库

sudo apt-get install libjpeg62-dev sudo apt-get install libjpeg8-dev

(2)树莓派浏览器访问https://github.com/jacksonliam/mjpg-streamer 下载源码,默认到/home/pi/Downloads目录,完成后解压缩。

由于市面上大部分摄像头是YUYV格式输出,所以要修改mjpg-streamer项目的代码文件,让其默认支持此格式的摄像头。

使用nano指令,或TextEditor打开mjpg-streamer-experimental/plugins/input_uvc/input_uvc.c这个文件,找到input_init函数,修改

“format = V4L2_PIX_FMT_MJPEG” 为

“format = V4L2_PIX_FMT_YUYV”。

(3) 编译、部署mjpg-streamer项目

sudo apt-get install cmake cd /home/pi/Downloads/mjpg-streamer-master/mjpg-streamer-experimental sudo make clean all

编译完成后,复制相关文件到指定目录

sudo cp mjpg_streamer /usr/local/bin sudo cp output_http.so input_uvc.so /usr/local/lib/ sudo cp -R www /usr/local/www

最后,使用指令来启动视频组件

LD_LIBRARY_PATH=/usr/local/lib mjpg_streamer -i “input_uvc.so -r 320×240 -f 12” -o “output_http.so -p 12001 -w /usr/local/www”

在谷歌浏览器中,就可以看到视频了,预览地址为 http://树莓派IP:12001/?action=stream

3. 安卓远程控制APP

使用Android Studio作为IDE,利用webview控件作为人机交互,简单快速。

(1) fish.html文件,放入assets目录

远程喂鱼

8:00自动开灯和水泵,17:00自动关灯和水泵

实时视频

(2)Activity里就一个WebView组件,主窗体后端代码MainActivity.java

package com.wszhoho.viewfish; import android.annotation.SuppressLint; import android.os.Bundle; import android.os.Vibrator; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.view.WindowManager; import android.webkit.JavascriptInterface; import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebView; import java.lang.ref.WeakReference; import java.util.Random; public class MainActivity extends AppCompatActivity { static WeakReference _webView; Vibrator vibrator; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE); Random rnd = new Random(100); int v = rnd.nextInt(); String webViewUrl = “file:///android_asset/fish.html?v=” + v; initWebView(webViewUrl); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } @SuppressLint(“SetJavaScriptEnabled”) private void initWebView(String url) { _webView = new WeakReference<>(findViewById(R.id.webView)); //重新设置WebSettings WebSettings webSettings = _webView.get().getSettings(); webSettings.setDisplayZoomControls(false); webSettings.setSupportZoom(false); webSettings.setAppCacheEnabled(true); webSettings.setAllowFileAccess(true); webSettings.setUseWideViewPort(true); webSettings.setLoadWithOverviewMode(true); webSettings.setSaveFormData(false); webSettings.setDomStorageEnabled(true); webSettings.setSupportMultipleWindows(true); webSettings.setJavaScriptCanOpenWindowsAutomatically(true); webSettings.setJavaScriptEnabled(true); _webView.get().addJavascriptInterface(this, “JSHook”); _webView.get().setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); _webView.get().canGoBack(); _webView.get().requestFocus(); _webView.get().setWebChromeClient(new WebChromeClient()); _webView.get().loadUrl(url); } @JavascriptInterface public String execTcpCmd(String op) { try { if (!op.equals(“getStatus”)) vibrator.vibrate(100); String ret = TcpClient.SendMsg(op); return ret; } catch (Exception ignored) { return “-1”; } } }

(3)TcpClient.java

package com.wszhoho.viewfish; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.Socket; import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.locks.ReentrantLock; class TcpClient { private static ReentrantLock lock = new ReentrantLock(); static String SendMsg(String msg) { lock.lock(); AtomicReference retStr = new AtomicReference<>(“”); new Thread(() -> { Socket client = null; try { client = new Socket(树莓派IP, 7654); BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); OutputStream os = client.getOutputStream(); os.write(msg.getBytes(“utf-8”)); os.flush(); retStr.set(in.readLine()); } catch (IOException e) { e.printStackTrace(); } finally { if (client != null) { try { client.close(); } catch (IOException e) { e.printStackTrace(); } } } }).start(); while (retStr.get().equals(“”)) { try { Thread.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); } } lock.unlock(); return retStr.get(); } }

(4)AndroidManifest.xml权限配置

自启动配置

首先更改系统默认的python运行版本:

sudo rm /usr/bin/python sudo ln -s /usr/bin/python3 /usr/bin/python

进入/home/pi/.config目录,建立autostart文件夹,进入该文件夹,建立两个后缀名为”.desktop”的文件。

camera.desktop文件,内容为:

[Desktop Entry] Type=Application Exec=/home/pi/scripts/startCamera.sh

tcpserver.desktop文件,内容为:

[Desktop Entry] Type=Application Exec=python /home/pi/scripts/MyTcpControl.py

完成后,重启树莓派,所有配置全部完成。

最终完成情况:

盒子巨丑,好在空间大,够放!

安卓APP,我家宝宝选的图标,巨喜欢 🙂

作者:wszhoho

项目主页:http://make.quwj.com/project/86

配置树莓派的音频输出:3.5MM/HDMI

树莓派默认是自动选择音频输出口的,当你同时外接了 HDMI 显示器和 3.5MM 耳机或音箱时,有时候你希望手动指定其中的一个作为音频的输出设备,那么可以通过下面的方法配置实现。如果你外接了DAC扩展板,配置好驱动之后也可以用这种方法选择DAC输出。

进入树莓派配置工具:

sudo raspi-config

选择 Advanced Options -> Audio。

然后这里列出了音频输出设备,选择强制 3.5mm 或者强制 HDMI 即可。

安装 A2DP 让树莓派变成蓝牙音箱

来自 rekcah1986 的分享,感谢~

0.变是不可能变的,你首先得有个普通音箱。

1.刷入Stretch系统,地址:https://downloads.raspberrypi.org/raspbian_latest

2.默认源好像有问题,换一下:

sudo vim /etc/apt/sources.list

#deb http://raspbian.raspberrypi.org/raspbian/ stretch main contrib non-free rpi <<---屏蔽该源 # Uncomment line below then 'apt-get update' to enable 'apt-get source' #deb-src http://raspbian.raspberrypi.org/raspbian/ stretch main contrib non-free rpi #替换为 http://mirrors.shu.edu.cn/raspbian/raspbian/ deb http://mirrors.shu.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi #<---增加 3.更新列表: sudo apt-get update && sudo apt-get -y dist-upgrade && sudo apt-get update 4.安装xrdp方便远程桌面登录(可不装): sudo apt install xrdp 5.安装a2dp支持 git clone https://github.com/bareinhard/super-simple-raspberry-pi-audio-receiver-install cd super-simple-raspberry-pi-audio-receiver-install git checkout stretch-fix sudo ./install.sh 6.安装过程中的几个选项,顺序记不太清了: (1)Car和Home那个,我选的Home,具体区别不清楚 (2)Device name和AirPlay Device Name,写PiMusic,其实随便写 (3)密码,不输入就可以 (4)Do you want all the Devices to use the same name? (y/n) : Choose y or n,选n (5)Which Sound Card are you using? (0/1/2/3/4/5/6/7/8/9/10/11),写0 7.装完以后,音箱插树莓派上,把树莓派的蓝牙查找打开,用手机蓝牙找到并连接,播放音乐即可。 8.搞不定的(在原文处)留言问我吧,哈哈~ 作者:rekcah1986 链接:https://www.jianshu.com/p/d3e522f908f3

树莓派 + MCC 118 实现数据采集

最近从树莓派实验室拿到一块 MCC 118 DAQ 扩展板的试用,这是我第一次接触专业的 DAQ 采集卡,怀着对数据采集的好奇开始摸索。

首先了解到这个板卡可以同时支持8路数据采集,但我这里暂时只需要用到其中1路来实现一个环境光线的采集。

我会使用一个安放在室外、具有模拟输出功能的光线传感器模块,采集其模拟电信号,并线性转换成一个光照的亮度指数。

在室内的一个鱼缸里,我安装了一个LED氛围灯,并尝试用采集到的室外光照亮度指数来设置这个LED氛围灯的亮度。

最终实现室内鱼缸的光照度和室外自然光照度实时同步,我的爱鱼也能实时感受到室外的天气变化了~

材料清单

树莓派(Raspberry Pi)一块

MCC 118 DAQ HAT 一块

光线传感器模块(带模拟输出)一个

RGB LED 模块一个(共阴或共阳,本例使用共阴)

面包板一块

杜邦线若干

瑞士军刀扩展板一块(可选)

一、安装环境

树莓派建议安装官方的 Raspbian 系统,不需要特别的配置。直接开始部署 MCC 118 配套的 SDK 和范例试试数据采集卡的工作情况,步骤如下(这里直接参考了这篇教程)。

sudo apt-get update sudo apt-get install git cd ~ git clone https://github.com/mccdaq/daqhats.git cd ~/daqhats sudo ./install.sh pip install dash dash-renderer dash-html-components dash-core-components

二、接线

先看光线传感器模块。

为什么用带模拟输出(AO)的光线传感器呢?是因为这款传感器如果只有数字输出(DO)的话,其输出的数据只能是高电平或低电平,只能反映光线是否达到某个设定的值,而无法反映出光线的强弱。

但树莓派本身并没有 ADC,无法直接读取模拟电信号(信号的强弱和光线强弱相关)。这时 MCC 118 DAQ 就派上用场了。

MCC 118 的排座设计将GPIO全部引出了,很方便外接其他传感器。

引脚连接表

光线传感器:VCC — 树莓派:5V

光线传感器:GND — MCC 118:GND

光线传感器:AO — MCC 118:CH1

RGBLED模块:GND — 树莓派:GND

RGBLED模块:R — 树莓派:BCM 17

RGBLED模块:G — 树莓派:BCM 27

RGBLED模块:B — 树莓派:BCM 22

三、测量采集和数值换算

启动 Web 波形图程序:

cd ~/daqhats/examples/python/mcc118/web_server ./web_server.py

接下来就可以在浏览器中打开 http://:8080 访问了。将其中的 替换成树莓派的 IP 地址或主机名。

要想停止 Web 服务,可以回到命令行界面按下 Ctrl+C 中止。

首先试试看这个传感器的AO输出的电压范围,用 MCC 118 SDK 中自带的 web_server 范例可以非常方便的检测到。这是一个类似示波器的应用,启动之后在浏览器打开,选择通道1后启动数据采集,通过开关灯可以看到电压的实时变化。

通过完全遮住光线传感器的光敏电阻,看到AO输出电压最大升至5V;用手机自带闪光灯照射在光敏电阻上,看到AO输出电压最小降到0V。看来0~5V就是这个传感器的模拟电信号输出范围(图表显示的电压伏特数是精确到小数点后6位的)。

为了简化后面的程序,我把0~5V的电压范围通过简单的公式换算到 100 ~ 0 的范围内,而树莓派的 PWM 支持的参数范围也是 0 ~ 100,这样刚好可以用树莓派的 PWM 来设置 LED 的亮度。

# 从通道1读取模拟电信号(电压) value = hat.a_in_read(1, options) # 光照亮度指数换算 light_index = 100 – round(value * 1000 / 50) # 根据光照亮度指数,通过 PWM 来设置LED的光照强度和颜色 # 红色光 pwmR.ChangeDutyCycle(light_index) # 绿色光 pwmG.ChangeDutyCycle(light_index) # 蓝色光 pwmB.ChangeDutyCycle(100)

其效果是白天光线最强时鱼缸灯光达到最强的白色光,到晚间,灯光中的红色和绿色光源逐渐减弱至0,则呈现出夜晚的蓝色光氛围。

四、代码和运行

完整代码如下,这个代码是在 MCC 118 范例 single_value_read 基础上修改而来的(范例做得清晰易懂很方便修改)。

#!/usr/bin/env python # -*- coding: utf-8 -*- from __future__ import print_function from time import sleep from sys import stdout from daqhats_utils import select_hat_device, enum_mask_to_string from daqhats import mcc118, OptionFlags, HatIDs, HatError # RGBLED import RPi.GPIO # Constants CURSOR_BACK_2 = ‘\x1b[2D’ ERASE_TO_END_OF_LINE = ‘\x1b[0K’ # RGBLED R,G,B=17,27,22 RPi.GPIO.setmode(RPi.GPIO.BCM) RPi.GPIO.setup(R, RPi.GPIO.OUT) RPi.GPIO.setup(G, RPi.GPIO.OUT) RPi.GPIO.setup(B, RPi.GPIO.OUT) pwmR = RPi.GPIO.PWM(R, 70) pwmG = RPi.GPIO.PWM(G, 70) pwmB = RPi.GPIO.PWM(B, 70) pwmR.start(0) pwmG.start(0) pwmB.start(0) def main(): “”” This function is executed automatically when the module is run directly. “”” options = OptionFlags.DEFAULT low_chan = 0 high_chan = 3 mcc_118_num_channels = mcc118.info().NUM_AI_CHANNELS sample_interval = 0.5 # Seconds light_index = 0 try: # Get an instance of the selected hat device object. address = select_hat_device(HatIDs.MCC_118) hat = mcc118(address) print(‘

MCC 118 single data value read example’) print(‘ Options:’, enum_mask_to_string(OptionFlags, options)) try: input(”

Press ‘Enter’ to continue”) except (NameError, SyntaxError): pass print(‘

Acquiring data … Press Ctrl-C to abort’) try: while True: # Read a single value from each selected channel. value = hat.a_in_read(1, options) light_index = 100 – round(value * 1000 / 50) led_display(light_index) print(‘\r{:12.5} V’.format(value), ‘\tIndex:{:5.4}’.format(light_index), end=”) stdout.flush() # Wait the specified interval between reads. sleep(sample_interval) except KeyboardInterrupt: # Clear the ‘^C’ from the display. print(CURSOR_BACK_2, ERASE_TO_END_OF_LINE, ‘

‘) except (HatError, ValueError) as error: print(‘

‘, error) pwmR.stop() pwmG.stop() pwmB.stop() RPi.GPIO.cleanup() def led_display(index): #print(index) pwmR.ChangeDutyCycle(index) pwmG.ChangeDutyCycle(index) pwmB.ChangeDutyCycle(100) if __name__ == ‘__main__’: # This will only be run when the module is called directly. main()

将程序代码文件 light.py 上传至树莓派,进入程序所在目录运行:

python light.py

光照强度指数最大时效果如下。

光照强度指数最小时效果如下。

应用到鱼缸(效果图)。

五、延伸应用

做这个实验的过程中在想如果 MCC 118 能自带一款显示屏用来显示采集到的实时数据就好了,后来发现手头有一款集成了数码管的瑞士军刀扩展板,刚好可以插在这个 MCC 118 引出的排针上,如图:

瑞士军刀扩展板也有很方便的 SDK,简单的整合了两部分代码,就实现了数码管动态显示光照强度指数,并能控制板载的8个LED实现1-8级亮度的小夜灯。

完整代码如下:

#!/usr/bin/env python # -*- coding: utf-8 -*- from __future__ import print_function from time import sleep from sys import stdout from daqhats_utils import select_hat_device, enum_mask_to_string from daqhats import mcc118, OptionFlags, HatIDs, HatError from sakshat import SAKSHAT import time # RGBLED import RPi.GPIO #Declare the SAKS Board SAKS = SAKSHAT() # Constants CURSOR_BACK_2 = ‘\x1b[2D’ ERASE_TO_END_OF_LINE = ‘\x1b[0K’ # RGBLED R,G,B=17,27,22 RPi.GPIO.setmode(RPi.GPIO.BCM) RPi.GPIO.setup(R, RPi.GPIO.OUT) RPi.GPIO.setup(G, RPi.GPIO.OUT) RPi.GPIO.setup(B, RPi.GPIO.OUT) pwmR = RPi.GPIO.PWM(R, 70) pwmG = RPi.GPIO.PWM(G, 70) pwmB = RPi.GPIO.PWM(B, 70) pwmR.start(0) pwmG.start(0) pwmB.start(0) def main(): “”” This function is executed automatically when the module is run directly. “”” options = OptionFlags.DEFAULT low_chan = 0 high_chan = 3 mcc_118_num_channels = mcc118.info().NUM_AI_CHANNELS sample_interval = 0.5 # Seconds light_index = 0 try: # Get an instance of the selected hat device object. address = select_hat_device(HatIDs.MCC_118) hat = mcc118(address) print(‘

MCC 118 single data value read example’) print(‘ Options:’, enum_mask_to_string(OptionFlags, options)) try: input(”

Press ‘Enter’ to continue”) except (NameError, SyntaxError): pass print(‘

Acquiring data … Press Ctrl-C to abort’) SAKS.buzzer.off() try: while True: # Read a single value from each selected channel. value = hat.a_in_read(1, options) light_index = 100 – round(value * 1000 / 50) led_display(light_index) print(‘\r{:12.5} V’.format(value), ‘\tIndex:{:5.4}’.format(light_index), end=”) stdout.flush() # Wait the specified interval between reads. sleep(sample_interval) except KeyboardInterrupt: # Clear the ‘^C’ from the display. print(CURSOR_BACK_2, ERASE_TO_END_OF_LINE, ‘

‘) except (HatError, ValueError) as error: print(‘

‘, error) pwmR.stop() pwmG.stop() pwmB.stop() RPi.GPIO.cleanup() def led_display(index): #print(index) pwmR.ChangeDutyCycle(index) pwmG.ChangeDutyCycle(index) pwmB.ChangeDutyCycle(100) SAKS.digital_display.show((“##%d” % int(index))) if index < 50: SAKS.ledrow.set_row([True, True, True, True, True, True, True, True]) else: SAKS.ledrow.set_row([False, False, False, False, False, False, False, False]) if __name__ == '__main__': # This will only be run when the module is called directly. main() 六、小结 看起来在专业领域才会接触到的数据采集,实际上也可以应用在日常的 DIY 实验之中。MCC 118 这块数据采集卡配以完善的程序库和范例,是树莓派平台上很容易上手的数据采集方案。在它的帮助下,我的爱鱼也能实时感受到室外的天气变化了~ 相关视频: 基于树莓派的电压采集模块MCC 118网络服务器范例 https://url.cn/utoHpkH2?sf=uri 基于树莓派的电压采集模块MCC 118数据记录仪例程 https://url.cn/VxXgwhEx?sf=uri 目前 MCC 118 扩展板可通过 Measurement Computing 公司官网购买获得 http://china.mccdaq.com。 有关本产品的相关问题和支持可以在 https://talk.quwj.com/topic/916 讨论,可获得 MCC 工程师专业的解答和技术支持。

树莓派上使用HC-SR04超声波测距模块

超声波测距的原理很简单,高中物理题不是做过很多次了么 😀

超声波测距原理

可以看到,知道时间间隔就能得到距离 L。

那么 HC-SR04 是怎么测距的呢?又怎么使用树莓派控制它?

HC-SR04 介绍

HC-SR04 模块可以测量 3cm – 4m 的距离,精确度可以达到 3mm。这个模块包括 超声波发射器、超声波接收器和控制电路三部分。有 4 个引脚。

HC-SR04 实物图

HC-SR04参数表

接线方式

4 个引脚由 2 个电源引脚(Vcc 、GND)和 2 个控制引脚(Trig、Echo)组成。

Vcc 和 Gnd 接 5v DC 电源,但不推荐用独立电源给它供电,应使用树莓派或单片机的 GPIO 口输出 5v 和 Gnd 给它供电。不然会影响这个模块的运行。

Trig 引脚用来接收来自树莓派的控制信号。接任意 GPIO 口。

Echo 引脚用来发送测距结果给树莓派。接任意 GPIO 口。

(注意 Echo 返回的是 5v信号,而树莓派的 GPIO 接收超过 3.3v 的信号可能会被烧毁,因此需要加一个分压电路)

HC-SR04 的测距过程

1. 树莓派向 Trig 脚发送一个持续 10us 的脉冲信号。

2. HC-SR04 接收到树莓派发送的脉冲信号,开始发送超声波 (start sending ultrasoun),并把 Echo置为高电平。 然后准备接收返回的超声波。

3. 当 HC-SR04 接收到返回的超声波 (receive returned ultrasound) 时,把 Echo 置为低电平。

从上述过程可以看出, Echo 高电平持续的时间就是超声波从发射到返回所经过的时间间隔 ~

请对照下图。

电路图与 python 程序

电路图

接线跟前文所说的一样。 GPIO 2 脚接 Trig , GPIO 3 脚接 Echo 。树莓派的 +5v 和 Gnd 与 HC-SR04 的 Vcc 和 Gnd 相连。还有一个分压电路,一端接 Echo ,另一端接 Gnd。

1k 和 2k 电阻组成了一个分压电路,使 GPIO 3 脚的电压降到了 3.3v 左右。

python 程序

初始化相关引脚:

2 脚连 Trig ,设为输出模式; 3 脚连 Echo,设为输入模式。

然后向 Trig 引脚输入 10us 的脉冲:

time.sleep() 接收的参数单位为 s ,于是把10 us 转换为 0.00001 s 。

接收到这个脉冲后,HC-SR04 发射出超声波,同时把 Echo 置为高电平。在发射之前,Echo 一直为低电平。

据此编写程序,记录超声波发射时的时间。

然后记录超声波返回时的时间。

这样就获得了我们需要的数据 pulse_start 和 pulse_end ,可以算出距离了~

测得距离(单位:m) = (pulse_end – pulse_start) * 声波速度 / 2

声波速度取 343m/s 。

然后再把测得的距离转换为 cm。

测得距离(单位:cm) = (pulse_end – pulse_start) * 声波速度 / 2 * 100

= (pulse_end – pulse_start) * 17150

以下是完整代码。

#导入 GPIO库 import RPi.GPIO as GPIO import time #设置 GPIO 模式为 BCM GPIO.setmode(GPIO.BCM) #定义 GPIO 引脚 GPIO_TRIGGER = 23 GPIO_ECHO = 24 #设置 GPIO 的工作方式 (IN / OUT) GPIO.setup(GPIO_TRIGGER, GPIO.OUT) GPIO.setup(GPIO_ECHO, GPIO.IN) def distance(): # 发送高电平信号到 Trig 引脚 GPIO.output(GPIO_TRIGGER, True) # 持续 10 us time.sleep(0.00001) GPIO.output(GPIO_TRIGGER, False) start_time = time.time() stop_time = time.time() # 记录发送超声波的时刻1 while GPIO.input(GPIO_ECHO) == 0: start_time = time.time() # 记录接收到返回超声波的时刻2 while GPIO.input(GPIO_ECHO) == 1: stop_time = time.time() # 计算超声波的往返时间 = 时刻2 – 时刻1 time_elapsed = stop_time – start_time # 声波的速度为 343m/s, 转化为 34300cm/s。 distance = (time_elapsed * 34300) / 2 return distance if __name__ == ‘__main__’: try: while True: dist = distance() print(“Measured Distance = {:.2f} cm”.format(dist)) time.sleep(1) # Reset by pressing CTRL + C except KeyboardInterrupt: print(“Measurement stopped by User”) GPIO.cleanup()

作者:jiang

链接:jianshu.com/p/293415ae3e9c

Scratch 3.0 版本发布,增强对外部硬件的支持

近日,Scratch 3.0 发布了,Scratch 是一款由麻省理工学院(MIT)MIT Media 实验室设计开发的一款基于图形化拖块形式的少儿编程工具,它通过点击并拖拽的方式可视化完成编程,帮助人们学会创造性地思考、系统地推理和协同工作。Scratch 的编程风格类似 Lego,建立的程序是用鲜艳的代码块拼接起来,其特别定制的界面允许儿童将图形和声音组合,创造简易动画。

本次上线的Scratch 3.0 版本,主要更新内容包括:

用户可以使用各种新的精灵,背景和声音;

新的扩展库允许用户添加连接到硬件和软件组件的新的块集,以便使用Scratch执行更多任务;

新的声音编辑器;

新的编程块;

支持平板(需要 Chrome 或 Safari 浏览器);

用户可以添加开发人员称为“扩展”的额外块集合。

此外,Scratch 3.0 能够更好地支持外部硬件,例如 micro:bit、乐高 WeDo2.0 科学机器人套装和头脑风暴教育EV3机器人等。此前,Scratch 也可以支持硬件编程,但系统大部分由第三方来提供。例如,Scratch 1.0的第三方工具S4A是由伯克利大学的一个软件团队来开发的,对 Arduino 进行了兼容。

树莓派基金会表示,他们未来会同时支持 Scratch 2 和 Scratch 3。

为 Raspberry Pi 创建 Scratch 3 将分为两个步骤:首先,我们将支持MIT优化Scratch 3,以确保它在各种设备上提供最佳性能; 一旦这项工作完成,我们将为Raspberry Pi 创建一个 Scratch 3 的离线版本,包括 GPIO 引脚和 Sense HAT 的新扩展。

via

用树莓派制造一个像样的 NAS

MAKER: tobychui/译:趣无尽 Cherry(转载请注明出处)

用树莓派做网络存储服务器(NAS)的案例有很多,我也一直在寻找用树莓派 DIY NAS 所需要的各种零部件,要求是外观漂亮、节省空间,然而一无所获。

我所看到的很多案例都是用木板粘接,集成度较低的方案,其散热性和可靠性将受到影响,想想你多年珍藏的电影资源和重要数据可能因此而丢失,这是很难以接受的。因此我决定自己做一个真正的NAS方案,它不仅外观上长得更像专业级的NAS,其内部核心部件也都是市面上买到的和专业NAS同等性能的部件。树莓派仅作为一个低功耗的主机存在,来运行 NAS 操作系统。

最初的设计草图。

在这个项目中,我不会使用任何专为树莓派 NAS 设计的部件。 相反,我将使用可以在电商平台上轻松找到的一些常见部件。 那么,开始吧!

材料清单

Raspberry Pi(树莓派)3B+ × 1

硬盘 × 若干

热插播硬盘托架 × 若干

电源管理开发板 × 1

继电器 × 1

按钮 × 若干

LED × 若干

亚克力板 × 若干

电源线 × 若干

热熔胶 × 若干

双面胶 × 若干

螺丝 × 若干

设计3D建模

在Autodesk Inventor中设计NAS外壳,并测试它们是否适合,检查每个组装点是否设计正确。

NAS外壳分为三个部分。左侧部分用于电源管理板和树莓派3B +。你也可以使用树莓派3或2B,它们的打印面积是相同。但使用树莓派3B +会更好一些,因为它更快。我稍后会详细说明。

右边部分是用于容纳两个5英寸硬盘,安装方式如图所示。背面的额外7厘米的空间用于安装风扇,直流插孔和布线。

3D模型文件,在项目文件库中下载。

http://make.quwj.com/project/79

打印和组装

打印完成后,我们可以开始组装外壳。

外壳由前面提到的三个部分组成,将它们用五个M3螺钉和十个M3(用于顶部和底部螺孔的连接)固定在一起。将按钮帽安装到位后,后续你就可以准备电子元件了。

按钮和信号LED

按钮和LED通过一些简单的电路连接,信号从树莓派的GPIO接到前面板。除了按钮安装有点棘手,其他都很简单。建议你用胶水将电路板安装到外壳之前进行一些测试打印。确保按钮的质量良好,开合方便。在我的设计中,由于红色的LED需要5V电源,所以我添加一个电阻,并计划将LED 的VCC引脚直接连接到电源管理板的5V输出上。你也可以使用树莓派上的3.3V GPIO引脚,不用额外增加电阻。

测试配件

1、右侧底部和顶部放置了两个2mm厚的亚克力板。用于加强对两个热插播硬盘托架的支持,因为硬盘在插入托架后有点沉。

2、使用了一个旧的USB硬盘驱动器,通常包含某种SATA转USB转换器电路板。对于我购买的那款,它配备了预先焊接的12V输入端口,可以支持3.5英寸硬盘驱动器的12V电源输入。

我将它们连接到两个HDD热插拔托架的末端,并将两根电缆连接到它的末端。其中一根带2.1mm DC插孔的电源线用于12V输入,另一根mini USB接头的电源线用于数据传送和5V电源。两根电源线排列有序,都向底部弯曲并保留一定空间。

硬盘的固定

将硬盘热插拔托架粘贴到外壳中。

1、在金属支架的外框上粘贴双面胶带,插入并固定托架。

2、在亚克力板和金属支架之间用强力胶粘合。记住将亚克力板上的纸取下来。

完成后,右侧外壳中的两个插槽,你可以通过热插拔托架上的手柄进行关开。

测试适合度

现在可以将硬盘插入托架了,它应该完全适合。 (如果没有,你应该考虑是否托架不匹配)

你可能会注意到右侧箱子顶部后面有两个圆形槽。这些是为USB电缆预留的。现在,你可以将电缆放入,这样看起来更整洁。

电源管理开发板

这是电源管理开发板。中间是一个Tinduino,它是一个定制版的Arduino,成本较低,此版本用于我们实验室的开发。当然,你可以使用Arduino UNO进行此操作,并在按下按钮时关闭继电器。

网上有很多教程可以教你如何制作这样的电路板,例如:

https://www.instructables.com/id/Toggle-Switch-With-Relay/

它是NAS的电源开关,所以你可以选择你想要的风格。

右边是降压转换器。它将树莓派和Arduino的电压从12V降低到5V。

最后,从左到右的底部第三个端口是12V电源输入,HDD1为12V电源输出,HDD2为12V电源输出。

将所有东西组装在一起

现在,将电源管理板与树莓派相连,如图所示。

插入12V电源输入,一切都应该会跑起来。(如果没有,也许你可以轻触按钮并激活Arduino继电器切换系统)

安装操作系统并开始创建自己的NAS接口

现在拧上所有螺丝,插上电源线,你认为这样就好了吗?

当然还没有。我们仍然需要安装软件。现在硬件的安装已经全部完成。

由于该软件仍处于开发阶段,我建议安装一些开源OS /NAS系统,如FreeNAS或开放式媒体库。但如果要构建自己的NAS,我建议从头开始。下一步,编写我自己的NAS操作系统!

1、从树莓派网站安装Raspbian Lite。

https://www.raspberrypi.org/downloads/raspbian/

2、将其安装在SD卡上。我认为网上有很多教程,此内容我不在复述。

首次使用树莓派,如何安装、启动及配置

ArOZ在线系统!

树莓派的媒体中心系统ArOZ Online(Alpha)

https://www.instructables.com/id/Simplest-Media-Center-for-Raspberry-Pi-Web-Server/

现在,我已将其完全重写为一个全新的DSM,如Web UI,称为ArOZ Online(Beta)

该系统适用于Window Host和Linux Host(当然还有Raspbian)。

系统有待完善

目前为止我写的系统检测到我已插入NAS的1TB驱动器。

接下来呢?该软件仍需要多年的开发才能顺利运行。

目前,5G WiFi到HDD的最大传输速度约为100Mbps。它对于小型计算机来说,可以完全处理你的所有请求,效果还是不错的。使用Samba(Window SMB / Network Disk)进行传输时,它可以达到93Mbps左右。这可能是使用树莓派 3B+的优势。

编者按

树莓派上搭建NAS的软件系统有多种选择,你可以直接使用完成度较高的系统:

OpenMediaVault NAS 系统

也可以使用最新版的 Raspbian 系统,并自行安装所需服务:

DLNA服务器

Aria2 下载服务器

via instructables.com/id/A-Raspberry-Pi-NAS-That-Really-Look-Like-a-NAS/

树莓派制造的绘图机器人

MAKER:jocomakerspace/译:趣无尽 Cherry(转载请注明出处)

本期介绍的项目是一台能绘制超大幅图形的绘图机,可直接在直立的画布平面上绘制任何图形,绘制过程颇具观赏性。核心系统用树莓派制造,支持通过 WIFI 接收图样。先来看一段测试视频。

材料清单

硬件

NEMA 17步进电机x2

吸盘x2

80磅钓鱼线x若干

Micro USB线10英寸×2

Micro USB转接板x2

USB A型母头转接板x2

Raspberry Pi(树莓派)Zero W(或其他支持WiFi的树莓派)

Micro SD卡

EasyDriver步进电机驱动板V4.5 x2

SG92R舵机x1

6003zz轴承x2

3针电机扩展板x若干

2.1mm x 5.5mm 插座x1

电源适配器12v 1a 带2.1mm 或5.5mm接线头x1

树莓派电源适配器x1

Pololu通用轮轴5mm(#4-40孔)x2

螺栓(#8-32 x 1-5/8 英寸)x2

螺丝(#4-40x 1/2英寸)x8

电机螺丝(M3 50 x 6mm电机螺丝)x8

小螺丝x2(用于固定笔/标记)

标准电线或跳线x若干

标记笔x1

卷尺或直尺x1

工具

电脑

烙铁x1

钳子/切割机x1

可选材料

纸x若干

USB风扇x1

热熔胶x1

回形针x1

标头针脚x1

面包板/电路板 x1

3D打印组件

Polargraph gondola 吊台

Servo horn extension 电机喇叭扩展板

Drawbot motor mount and spool 绘图机器人舵机底座和线轴(x2)

Drawbot electronics case 绘图机器人电子外壳(可选)

Drawbot Pi + Stepper mount 树莓派绘图机器人+步进式安装部件(可选)

Suction Cup Dome with hole 带孔的吸盘圆顶(可替代)

以上图纸文件在本项目文件库中可以下载。

http://make.quwj.com/project/80

步进电机和吸盘组件的安装

需要3D打印的部件有:两个电机安装座,两个线轴以及两个带有1/8英寸的带孔吸盘圆顶,所有材料用PLA打印。

所需的硬件:两个步进电机,两个吸盘,两个通用安装轮轴,两个螺栓(#8-32x 5/8英寸),八个线轴螺丝(#4-40x 1/2英寸),八个电机螺丝(M3 50 x 6mm电机螺丝)以及钓鱼线若干。

注意:吸盘需要一个金属的长柱与电机底座相连。

1、用通用的铝质安装轴与步进电机连接。使用安装轮毂附带的固定螺丝,将轮毂安装到靠近步进轴末端的位置。

2、使用四个3D打印的M3螺丝将扭转电机支架连接到步进电机。扭转电机的底座带有凹口,以便安置电机。

3、使用4-40螺丝将3D打印的线轴连接到安装轮毂上。

4、安装吸盘底座。首先拆卸吸盘,保留橡胶吸盘,弹簧和金属杆。在吸入圆顶上钻一个1/8英寸的“孔”并拧入螺栓或使用带孔的吸盘圆顶,将3D打印的圆顶放在橡胶吸盘上。将电机底座向下推到吸盘上,以便将螺丝穿过金属杆。

5、做另一个相同的支架。

6、钓鱼线缠在线轴上。

注意:Harbor Freight吸盘是必须的,它的金属杆比其他吸盘更长。型号为62715。

笔架吊台的安装

需要3D打印的部件有:Polargraph Gondola(吊台),两个轴承连接臂,两个轴承连接器,一个吊台固定器,一个电机扩展板。

所需硬件有:一个SG92R舵机,两个6003zz轴承,一个扎口线。

1、将3D打印的电机扩展臂粘贴到其中一个舵机臂上。在这个环节中,可以使用回形针来固定,将它剪成两半,然后并粘贴到舵机臂上。

2、使用扎带将舵机系统固定在吊台上。

3、将带插槽的轴承连接器与轴承连接臂相连。将轴承推入到轴承连接器组件。3D打印部件需要继续打磨,以便轴承向下推入到轴承连接器。

4、滑动吊台上有轴承连接器和臂。 3D打印吊台上的轴也需要仔细打磨,以使轴承向下滑动。

5、安装吊台固定器,将所有东西组装在一起,使用螺丝将其固定在吊臂轴上,这样就可以在移动时固定笔。

安装软件

请使用树莓派的准备指南

对于这一步,我建议参考绘图机器人Githnb。

在树莓派上更新、升级安装包,并安装其他软件:

更新和升级:

sudo apt-get update sudo apt-get upgrade

安装NPM和Git:

sudo apt-get install npm sudo apt-get install git

安装Node.js:

sudo npm install -g n sudo n stable

升级NPM – 并删除旧的apt-get版本:

sudo npm install npm@latest -g sudo apt-get remove npm sudo reboot

安装pigpio C库:

sudo apt-get install pigpio *if you’re using Raspbian Lite* npm install pigpio

安装绘图机器人软件:

git clone https://github.com/andywise/drawbot.git cd drawbot npm i

启动绘图机器人软件:

cd/drawbot npm start -or- sudo node draw.js

连接绘图机器人控制界面

使用另一台计算机或直接在树莓派本机访问机器人控制界面,方式如下:

Mac 电脑:打开http://raspberrypi.local/control并访问绘图机器人控制界面。

PC:输入树莓派的 IP 地址/control 例如:http://10.167.5.58/control

树莓派本地:打开浏览器。访问http://127.0.0.1/control即可。

接线

所需硬件有:两个USB A型母头转接板,两个EasyDriver步进电机驱动板,一个树莓派Zero或其他支持WiFi的树莓派,两个步进电机,两个Micro USB转接板,一个2.1mm x 5.5mm的插座。

你可能需要的其他部分:

用于测试连接的面包板

标头针脚

3D 打印的步进电机和树莓派底座

电路板

将EasyDriver电机驱动板连接到树莓派:

左侧驱动器:

GND → 树莓派 GPIO 39

DIR → 树莓派GPIO 38(BCM 20)

STE → 树莓派GPIO 40(BCM 21)

右侧驱动器:

GND → 树莓派GPIO 34

DIR → 树莓派 GPIO 31(BCM 6)

STE → 树莓派 GPIO 33(BCM 13)

吊台电机:

GND → 树莓派 GPIO 14

VCC → 树莓派 GPIO 1(3V3电源)

CNT → 树莓派 GPIO 12(BCM 18)

注意:进行测试以确保连接正确,建议先将面包板连接在一起,然后再将其他部件连接在一起。

1、请焊接好树莓派/EasyDriver的排针。

2、将电路板上电机部分的每个EasyDriver驱动板接口与USB母头相连。对于此步骤,你最好参照有步进电机的数据表或参数。确保将绕组/线圈保持在一起。步进器有一对黑色线、绿色线、红色线和蓝色线。

在这里,将”Winding A”保持接地,D +与USB接口相连,”Winding B”与USB接口上的VCC和D-相连。

3、使用跳线将电机连接到树莓派的GPIO上。请参阅上述信息。

4、使用跳线将EasyDriver驱动板连接到树莓派的GPIO上。请参阅上述信息。

5、再次将步进电机线连接到Micro USB转接板上,确保所有线匹配正确。

6、EasyDrivers需要动力。将插座的尖端连接到EasyDrivers上的”PWR IN”,将插座的套管连接到EasyDrivers上”PWR IN”的GND。使用电路板将电源和地面从插座分离到EasyDrivers驱动板。

测试绘图

一旦你的树莓派,EasyDrivers驱动板和USB转接板通过面包板连接在一起,就可以进行测试了。

1、树莓派软件设置

在树莓派上启动绘图机器人控制器软件。这样可以更容易控制电机和舵机。点击控制器靶心中间的按钮笔,希望可以让舵机臂90°旋转,这样方便测试并确保舵机臂正确定位,还可将笔从表面抬起。当你连接了树莓派和绘图机器人控制器软件后,就会知道了。

2、步进电机的连接

一次启动一个步进电机会更易于操作。将步进电机与绘图机器人控制器靶心上的坐标同步。步进电机必须平稳移动。如果步进电机接线正确并且配对匹配,那么步进电机的测试完成,请接着测试另一个。

断开步进电机电源后,找一个平坦、光滑的表面安装步进电机,确保它们彼此保持水平平面。从每个线轴延伸一些钓鱼线并将其连接到吊台的支撑臂上。

重新连接步进电机。使用绘图机器人控制器移动吊台。当点击靶心的右上角时,如果不调整配置文件,吊台应该移动到右上角。如果吊台移动相反方向,应该打开配置树莓派上的镜像文件。

3、测量

接下来就是测量。我们使用小型的可伸缩卷尺,所有测量都以毫米为单位。

点击并设置绘图机器人控制器中的图标,将需要三个值,“D”,“X”和“Y”。有关如何测量的说明,如图所示。第一个“D”值是线轴之间的距离。下一个值是吊台的起始位置。 “X”值是从左侧线轴到吊台中笔的位置的测量值。 “Y”值是从线轴到吊台的距离。将这些值输入到绘图机器人软件的设置中。建议在左上角设置主页。

4、绘图

终于可以开始绘图啦!

只要所有东西都尽可能准确地测量;吊台中的笔从表面上抬起并归位,就可以让绘图机器人来一个SVG。只需将单个路径SVG拖到绘图机器人软件的靶心上即可开始绘图,我已经为绘图机器人添加校准功能。

绘图机器人校准文件,在项目文件库中下载。

http://make.quwj.com/project/80

via

Raspberry Pi (树莓派) 3A+版发布

今天,Raspberry Pi(树莓派)基金会宣布发布树莓派3代A+版(Raspberry Pi 3 MODEL A+)。尺寸是标准的树莓派A+尺寸,继承了3代的双频2.4GHz和5GHz无线网络、蓝牙4.2/BLE,以及经过改进的散热管理。拥有64位四核1.4 GHz处理器,并且价格低至25美元。

就像2014年树莓派A+系列首次面世时那样,通过在B+型基础上减半内存、移除USBHUB和以太网卡来寻求更低的成本控制。树莓派3代A+参数如下:

1.4GHz 64位四核ARM Cortex-A53 CPU

512MB LPDDR2 SDRAM

双频802.11ac无线局域网和蓝牙4.2/BLE

改进的USB大容量存储启动

改善的散热管理

请看下面的预览视频:

树莓派3代B+与A+版的对比:

树莓派3代A+与1代A+版的对比:

机械尺寸如下:

配套外壳(基金会表示12月会出一套适用于A+版的塑料外壳):

点这里可购买。