树莓 RaspberryPi 派:

一般而言,我自己做些小东西来控制各种电子玩意我喜欢用 Arduino。 原因无他,因为晶片价格便宜,开发环境完备,资源多。但是 Arduino 还是有缺点的,毕尽ATmega 只是个简单的八位元单晶片微处理器,不太可能在上面架上复杂的作业系统的,所以要做重量级的应用就很吃力了。

若要做极端复杂的重量级运用,上网查了一下,目前最流行的应该就是树莓派 Raspberry Pi 啰!采用主流威力强大的 ARM 架构微处理器核心,以太网路,USB,HDMI 影像输出的高度整合。采用 micro SD 来当巨量的储存媒介,后期的版本连 wifi/蓝芽都是内建的了。也有设计了 40 pins 的 GPIO 数位I/O来做各种外部控制的需求,仿效 Arduino 开源硬体的概念,吸引了各式各样的硬体资源的进驻。最后配上特制的 Linux 作业系统。整个就是一台威到不行的超级迷你 Linux 电脑。有了 Linux 的威力进驻,那个使用几乎是完全没有任何极限的强大,甚至用一堆板子来组个超级电脑丛集都是可以啰!

极端迷你的体积,便宜的售价。这也使得 RaspberryPi 成为受欢迎的嵌入式系统平台。各种强大有趣的专案,例如 AI 人脸辨识,骇客用无线网路扫描仪,AI网路摄影机,家庭物联网控制中心,掌上GameBoy 模拟器,... 有了 Linux 真的应用上几乎没有极限哟。

 

gFORTH 语言:

既然树莓派采用的是 Linux 作业系统,自然我们这个核心是以 C 语言撰写的,可以在各大 Linux/UNIX 核心下合作愉快的 gFORTH 公开 FORTH系统,也可以被轻易的安装跟执行啰。这就是树莓派的优势啰,一采用了 Linux ,等于各种程式语言都可以直接进驻啰。从官方喜爱现在最红的 Python, 或是 C++, ... 重新编译安装后就可以使用啰。要老骨头的 FORTRAN,要年轻的 Apple Swift 可是都没问题哪!

作为 FORTH 的爱好者,我们当然是要选用 FORTH 来做我们的控制语言啦!所以这篇就来个安装篇,教你如何在树莓派 RaspberryPi 上安装 gFORTH,及一些对应的 GPIO 控制函式库来做控制。

 

WiringPi GPIO 函式库:

树莓派对外部硬体控制的主角就是 40 Pins 的 GPIO, 这 40 Pins 都是数位 I/O 所以没有 ADC/DAC 数位跟类比的转换,这是唯一可惜比 Arduino 还弱的一个地方。另外一个小缺点,用的是 3.3V 的逻辑系统,也没有设计保护,要很小心不然容易烧掉弄坏整片板子。(比 Arduino 脆弱多了)

目前由于非常受欢迎的 Python 语言官方已经有对应的函式库来控制这些 GPIO。所以以树莓派来做控制,目前看到最普遍跟受欢迎的还是采用 Python 语言,因为最简单。 而其他语言,例如 C++ 语言想要控制的话,大家都是借助一个叫做 WiringPi (WiringPi 是一个免费的专案,官方连结在此!)的一个以C语言所撰写的 RaspberryPi GPIO 控制函式库来当作跟这些 GPIO 沟通的介面。WiringPi 设计上是仿效 Arduino 的开发环境,相类似的 I/O 控制语法,方便大家来使用并控制 GPIO 的输入输出啰。 

这边 gFORTH 想要做控制,跟 C++ 语言一样,我们也是透过 WiringPi 这个介面来控制 GPIO 啦!原本的 gFORTH 当然不可能知道有 WiringPi 这种东西,这里要透过国外一位所撰写的 FORTH 呼叫 WiringPi 程式,来衔接 WiringPi 函式库,最后让我们的 gFORTH 可以控制 GPIO。

 

所以接续下来整个流程如下:

1. 安装 gFORTH, 2. 安装 WiringPi 函式库, 3. 下载 wiringPi.fs 串接 gFORTH 程式码. 4. 测试 LED 点灭

这整个安装流程来自于 RaspberryPi 社群的这篇讨论串,对于来龙去脉有疑虑的请参考。然后要谢谢 wiringPi.fs 的作者 Kris Johnson,透过他的程式码,现在让我们可以很方便的透过 gFORTH 来呼叫 WiringPi 作控制啰。

 

1. 安装 gFORTH

不像难搞的 Apple 那个麻烦的 MacOS。拜 Linux 有内建很方便的套装安装管理 apt-get 之赐,所以很简单的,只要一行指令就搞定啰

sudo apt-get install gforth

 

(假如想自己从头 build 整个 gforth, 请参考这篇树莓论坛的文章.)

 

2. 安装 WiringPi 函式库

两个步骤 (对 WiringPi 有兴趣的,这里有篇台湾的 BLOG 也有详述安装跟使用方法,也很值得参考)

sudo apt-get install libtool-bin

sudo apt-get install wiringpi

 

3. 下载 wiringPi.fs gFORTH 程式码

作者 Kris Johnson 在 GitHub 的原始程式码位置 重点其实是那个档名叫 wiringPi.fs 的 FORTH 程式档。

也可以照树莓派论坛的方式用下列指令安装

sudo apt-get install git-core

git clone https://github.com/kristopherjohnson/wiringPi_gforth.git

cp wiringPi_gforth/wiringPi.fs .

 

4. LED 点灭测试

软体跟环境搞定了,让我们来试看看能不能真的拿来控制啰!笔者拿来测试的这个树莓派是 Zero W 的这个版本。这个版本真的是不错,价格便宜,体积超迷你,又内建蓝芽,wifi 这些很重要的通讯功能。真的是海放一些其他的控制板啰。

首先要先来搞懂 WiringPi 的 Pin 脚编号系统。 WiringPi  也支援 shell 指令,所以先键入下面指令,确认一下你的机型各接脚的编号分配的实际状况。

sudo gpio readall

 

马上会在终端机上显示如下,所有 I/O 的目前状况,各脚位的各种代码及目前状态 模式 IN/OUT, 数值 0/1 

RaspberryPi ZeroW 的分配情况

wiringPi ZeroW.png

要非常注意的, Physical 是实际的接脚编号。 RaspberryPi 有两种编号系统,一个叫做 wPi ,另外一个叫做 BCM 。采用哪种编号系统是由我们一开始启始 WiringPi 函式库时所决定的!

如果用 wiringPiSetupGpio 来启始 wiringPi 函式库,这时候接脚编号采用的就是 BCM 编号系统。

如果用 wiringPiSetup  来启始 wiringPi 函式库,这时候接脚编号采用的就是 wPi 编号系统。

然后要再三提醒,这个 RaspberryPi 不比 Arduino,是比较脆弱些!逻辑系统是采用 3.3 V 的,内部没有保护电路,所以接错接脚不小心接到 5V,或者通过的电流过大可是会直接烧坏这片贵贵的板子的哟!不想破财的话接电前可是要再三的确认跟检查。

 

简单的 LED 测试接线如下,

因为太简单了,接线图就不列了。就 GPIO 左边那排算过来第6根脚 (物理接脚 pin 11 = BCM 17 = wPi 0) 接到 LED 正极,LED正极前接上一根 220 ohm (红红棕)的限流电阻。 ( (3.3V - 2V) / 220 ohm = 5.9mA 左右的电流)

接地接在 GPIO 右边那排算过来第3接脚(物理接脚 pin 6, 0V GND) 接到 LED 负极。

物理接脚 pin 11 = BCM 17 = wPi 0

wiring pic.png

 

程式解说

就先把 wiringPi.fs 这个 FORTH 跟 wiringPi 的函式库介面程式码先载进来

include wiringPi.fs

 

然后启始 wiringPi 函式库,它会回传一个值,就直接忽视它 (哈..)

wiringPiSetupGpio  drop

 

因为用的是 wiringPiSetupGpio 来启始,所以接脚编号采用的是 BCM 系统

(如果用 wiringPiSetup 来启始,接脚编号会是 wPi 系统)

所以 物理接脚 pin 11 = BCM 17 = wPi 0

17 constant LED_Pin

 

我们是要控制 LED 的,所以这根 digital I/O 的模式是输出 OUTPUT,利用 <pin> <INPUT/OUTPUT> pinMode 指令设定一下!

LED_pin OUTPUT pinMode

 

透过 <pin> <HIGH/LOW>  digitalWrite 的指令,对 pin 脚输出 HIGH/LOW 讯号

: LED_ON  LED_pin HIGH digitalWrite ;

: LED_OFF LED_pin LOW  digitalWrite ;

 

透过 <milliseconds> delay 的指令,让程式精确停止特定 milliseconds

: Pause 500 delay ;

 

主程式,点亮 LED 后停 0.5秒,关掉 LED 后再停 0.5秒,然后无穷重复下去

: Flashing
   begin  LED_ON  Pause
          LED_OFF Pause
   again
;

 

想要停下来,用 control-C 两键同时按下去后强迫停止。

 

测试影片

 

 

谁掌握了 LED 闪灭,谁就掌握了世界! (握拳

 

 

完整测试程式码如下

\
\ GPIO LED test for gforth wiringPi C library
\

include wiringPi.fs

wiringPiSetupGpio  drop

17 constant LED_Pin

LED_pin OUTPUT pinMode


: LED_ON  LED_pin HIGH digitalWrite ;

: LED_OFF LED_pin LOW  digitalWrite ;

: Pause 500 delay ;

: Flashing
   begin  LED_ON  Pause
          LED_OFF Pause
   again
;

 

xxx

 

 

相关文章