rabbit-slide-hasumikin-RubyConfTaiwan2023 2023.12.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.rabbit +1 -0
- data/PicoRuby_ep4.rab +508 -0
- data/README.rd +24 -0
- data/Rakefile +17 -0
- data/config.yaml +24 -0
- data/images/QR_R2P2.png +0 -0
- data/images/QR_picoruby.png +0 -0
- data/images/QR_prk_firmware.png +0 -0
- data/images/R2D2_mosaic.png +0 -0
- data/images/boot_button_1.png +0 -0
- data/images/broadcaster_bb.png +0 -0
- data/images/c3p0_icon-icons.com_76936.png +0 -0
- data/images/disable-bluetooth.jpg +0 -0
- data/images/download-r2p2.png +0 -0
- data/images/ewok_icon-icons.com_76943.png +0 -0
- data/images/hasumi.jpg +0 -0
- data/images/hello_taiwan.jpg +0 -0
- data/images/install-uf2.png +0 -0
- data/images/kamos-2023.jpg +0 -0
- data/images/lcd-and-thermo.jpg +0 -0
- data/images/mark_g.png +0 -0
- data/images/mark_y.png +0 -0
- data/images/observer_bb.png +0 -0
- data/images/pico-and-pico_w.jpg +0 -0
- data/images/r2d2_icon-icons.com_76952.png +0 -0
- data/images/setup.jpg +0 -0
- data/images/star-background.jpg +0 -0
- data/images/teraterm.png +0 -0
- data/images/title-background.png +0 -0
- data/pdf/RubyConfTaiwan2023-PicoRuby_ep4.pdf +0 -0
- data/theme.rb +182 -0
- metadata +88 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: ed5c251ae68675cfad989272e87c634d1f9d2922d2037bda80b02905aecbf9e6
|
4
|
+
data.tar.gz: a152b4b8cf5d17656ce7b0650e9646e6bbf73d1923155bab027f1075181bf703
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: c801ae7cbdf4a9c25b1c986e33b03ec9be314f642dff50c092c72339f4ec568ffcd1f95e5f1dd9683ba946f1d5f7ee4ccdfb14315a02133f064f889f78b7f58c
|
7
|
+
data.tar.gz: d9229b3b921d4cefd68a38871698a85c4e1c3e0b1b11fb024c91e3a198fd5aef236365913565aa346ebe5844707c1abedc94836da76bc2a7bae223845543d0d8
|
data/.rabbit
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
PicoRuby_ep4.rab
|
data/PicoRuby_ep4.rab
ADDED
@@ -0,0 +1,508 @@
|
|
1
|
+
= pico
|
2
|
+
|
3
|
+
: subtitle
|
4
|
+
THE RISE OF MICROCONTROLLER
|
5
|
+
: author
|
6
|
+
ruby
|
7
|
+
: content-source
|
8
|
+
EPISODE Ⅳ
|
9
|
+
: institution
|
10
|
+
@hasumikin
|
11
|
+
: place
|
12
|
+
RubyConf Taiwan 2023
|
13
|
+
: date
|
14
|
+
Dec. 15, 2023
|
15
|
+
: allotted-time
|
16
|
+
38m
|
17
|
+
: theme
|
18
|
+
theme
|
19
|
+
|
20
|
+
= sub_chapter
|
21
|
+
Find PicoRuby's history on the internet
|
22
|
+
\n
|
23
|
+
\n
|
24
|
+
EPISODE Ⅱ
|
25
|
+
\n
|
26
|
+
(('tag:large:ATTACK OF THE RAKE'))
|
27
|
+
\n
|
28
|
+
\n
|
29
|
+
EPISODE Ⅲ
|
30
|
+
\n
|
31
|
+
(('tag:large:REVENGE OF THE STDIN'))
|
32
|
+
\n
|
33
|
+
\n
|
34
|
+
Extra edition in Euruko 2023
|
35
|
+
\n
|
36
|
+
(('tag:large:"A Beginner's Complete Guide"'))
|
37
|
+
|
38
|
+
== prop
|
39
|
+
: hide-title
|
40
|
+
true
|
41
|
+
|
42
|
+
= self.inspect
|
43
|
+
|
44
|
+
* Hitoshi HASUMI
|
45
|
+
* hasumikin (('tag:small:(GitHub ,ex-Twitter, Bluesky and Mastodon)'))
|
46
|
+
* Creator of PicoRuby and PRK Firmware
|
47
|
+
* Committer of CRuby's IRB and Reline
|
48
|
+
* First prize of Fukuoka Ruby Award\n(2020 and 2022✌️)
|
49
|
+
* A final nominee of Ruby Prize 2021
|
50
|
+
|
51
|
+
# image
|
52
|
+
# src = images/hasumi.jpg
|
53
|
+
# align = right
|
54
|
+
# relative-height = 95
|
55
|
+
# relative_margin_top = 50
|
56
|
+
# relative_margin_left = 25
|
57
|
+
|
58
|
+
= I have a favor to ask
|
59
|
+
|
60
|
+
(('tag:center'))
|
61
|
+
If possible, please turn off your Bluetooth
|
62
|
+
|
63
|
+
# image
|
64
|
+
# src = images/disable-bluetooth.jpg
|
65
|
+
# relative_height = 80
|
66
|
+
|
67
|
+
(('tag:center'))
|
68
|
+
To avoid channel congestion during my talk
|
69
|
+
|
70
|
+
= Let's begin 1/5
|
71
|
+
* Connect Pi Pico and PC while\npressing the BOOTSEL button
|
72
|
+
* You'll find "RPI-RP2" drive\nin file manager
|
73
|
+
|
74
|
+
# image
|
75
|
+
# align = right
|
76
|
+
# src = images/boot_button_1.png
|
77
|
+
# relative-height = 80
|
78
|
+
# relative_margin_left = 0
|
79
|
+
# relative_margin_top = 0
|
80
|
+
|
81
|
+
(('tag:right'))
|
82
|
+
(('tag:xx-small'))\n\n\n\n\n\n\n
|
83
|
+
https://www.raspberrypi.org/documentation/rp2040/getting-started
|
84
|
+
|
85
|
+
= Let's begin 2/5
|
86
|
+
* Download the latest\n`((*R2P2*))-*.uf2`\nfrom GitHub
|
87
|
+
|
88
|
+
# image
|
89
|
+
# align = right
|
90
|
+
# src = images/download-r2p2.png
|
91
|
+
# relative-height = 90
|
92
|
+
# relative_margin_left = 20
|
93
|
+
# relative_margin_top = 0
|
94
|
+
|
95
|
+
(('tag:x-small'))\n\n\n\n
|
96
|
+
https://github.com/picoruby/((*R2P2*))/releases
|
97
|
+
|
98
|
+
= Let's begin 3/5
|
99
|
+
|
100
|
+
* Drag & drop `((*R2P2*))-*.uf2` into RPI-RP2 drive
|
101
|
+
|
102
|
+
# image
|
103
|
+
# align = bottom
|
104
|
+
# src = images/install-uf2.png
|
105
|
+
# relative-height = 90
|
106
|
+
# relative_margin_left = 0
|
107
|
+
# relative_margin_top = 1
|
108
|
+
|
109
|
+
= Let's begin 4/5
|
110
|
+
* Open a proper\nserial port on\nterminal emulator
|
111
|
+
|
112
|
+
# image
|
113
|
+
# align = right
|
114
|
+
# src = images/teraterm.png
|
115
|
+
# relative-height = 90
|
116
|
+
# relative_margin_left = 12
|
117
|
+
# relative_margin_top = 0
|
118
|
+
|
119
|
+
= Let's begin 5/5
|
120
|
+
* ((*R2P2*)) is a Unix-like shell\nrunning on Pi Pico
|
121
|
+
* You can use some\ncommands like `cd`,\n`ls`, `mkdir`, and `((*irb*))`
|
122
|
+
* Every computing process\nis happening on Pi Pico
|
123
|
+
|
124
|
+
# image
|
125
|
+
# align = right
|
126
|
+
# src = images/teraterm.png
|
127
|
+
# relative-height = 90
|
128
|
+
# relative_margin_left = 20
|
129
|
+
# relative_margin_top = 5
|
130
|
+
|
131
|
+
= By the way, ((*R2P2*)) stands for
|
132
|
+
|
133
|
+
\n\n
|
134
|
+
(('tag:large:((*R*))uby on'))
|
135
|
+
\n
|
136
|
+
(('tag:large:((*R*))aspberry'))
|
137
|
+
\n
|
138
|
+
(('tag:large:((*P*))i'))
|
139
|
+
\n
|
140
|
+
(('tag:large:((*P*))ico'))
|
141
|
+
|
142
|
+
# image
|
143
|
+
# align = right
|
144
|
+
# src = images/R2D2_mosaic.png
|
145
|
+
# relative-height = 90
|
146
|
+
# relative_margin_left = -10
|
147
|
+
# relative_margin_top = 0
|
148
|
+
|
149
|
+
= Today's setup
|
150
|
+
|
151
|
+
* Raspberry Pi Pico W * 2
|
152
|
+
* AQM0802 charactor\ndisplay module
|
153
|
+
* ADT7310 thermo\nsensor module
|
154
|
+
* FTDI USB-TTL serial\ncoverter cable
|
155
|
+
|
156
|
+
# image
|
157
|
+
# align = right
|
158
|
+
# src = images/setup.jpg
|
159
|
+
# relative-height = 85
|
160
|
+
# relative_margin_left = 10
|
161
|
+
# relative_margin_top = 0
|
162
|
+
|
163
|
+
= Raspberry Pi "Pico" and "Pico W"
|
164
|
+
|
165
|
+
# image
|
166
|
+
# src = images/pico-and-pico_w.jpg
|
167
|
+
# relative_height = 100
|
168
|
+
# draw1 = [text, Pico, 0.18, 0.75, {color: white, size: 80, font_family: 'Courier Prime', weight: bold}]
|
169
|
+
# draw2 = [text, Pico W, 0.5, 0.75, {color: white, size: 80, font_family: 'Courier Prime', weight: bold}]
|
170
|
+
|
171
|
+
= GPIO
|
172
|
+
|
173
|
+
irb> gpio = CYW43::GPIO.new(CYW43::GPIO::LED_PIN)
|
174
|
+
# gpio = GPIO.new(25, GPIO::OUT) # If Pico w/o W
|
175
|
+
irb> gpio.write 1 #=> LED turns on
|
176
|
+
irb> gpio.write 0 #=> LED turns off
|
177
|
+
irb> 3.times do
|
178
|
+
irb* gpio.write 1
|
179
|
+
irb* sleep 1
|
180
|
+
irb* gpio.write 0
|
181
|
+
irb* sleep 1
|
182
|
+
irb* end #=> LED blinks three times
|
183
|
+
|
184
|
+
= LED wraps GPIO
|
185
|
+
|
186
|
+
# enscript ruby
|
187
|
+
# /lib/led.rb in R2P2 drive
|
188
|
+
require 'gpio'
|
189
|
+
require 'cyw43'
|
190
|
+
CYW43.init
|
191
|
+
class LED
|
192
|
+
def initialize
|
193
|
+
@gpio = CYW43::GPIO.new(CYW43::GPIO::LED_PIN)
|
194
|
+
# = GPIO.new(25, GPIO::OUT) # If Pico w/o W
|
195
|
+
end
|
196
|
+
def on
|
197
|
+
@gpio.write 1
|
198
|
+
end
|
199
|
+
def off
|
200
|
+
@gpio.write 0
|
201
|
+
end
|
202
|
+
def invert
|
203
|
+
@gpio.read == 1 ? off : on
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
207
|
+
= LED wraps GPIO
|
208
|
+
|
209
|
+
irb> require 'led'
|
210
|
+
irb> led = LED.new
|
211
|
+
irb> 3.times do
|
212
|
+
irb* led.invert
|
213
|
+
irb* sleep 1
|
214
|
+
irb* end
|
215
|
+
|
216
|
+
= Peripherals for serial communication
|
217
|
+
* I2C: To communicate between integrated circuits with support for multiple devices connected to the same bus
|
218
|
+
* SPI: To facilitate high-speed communication between microcontrollers and peripheral devices
|
219
|
+
* UART: To establish asynchronous serial communication between devices
|
220
|
+
|
221
|
+
= I2C
|
222
|
+
|
223
|
+
irb> require 'i2c'
|
224
|
+
irb> i2c = I2C.new(unit: :RP2040_I2C1, sda_pin: 26, scl_pin: 27)
|
225
|
+
irb> [0x38, 0x39, 0x14, 0x70, 0x56, 0x6c].each { |i| i2c.write(0x3e, 0, i); sleep_ms 1 }
|
226
|
+
irb> [0x38, 0x0c, 0x01].each { |i| i2c.write(0x3e, 0, i); sleep_ms 1 }
|
227
|
+
irb> "Hello,".bytes.each { |c| i2c.write(0x3e, 0x40, c); sleep_ms 1 }
|
228
|
+
irb> i2c.write(0x3e, 0, 0x80|0x40)
|
229
|
+
irb> "Taiwan!".bytes.each { |c| i2c.write(0x3e, 0x40, c); sleep_ms 1 }
|
230
|
+
|
231
|
+
\n
|
232
|
+
|
233
|
+
# image
|
234
|
+
# src = images/hello_taiwan.jpg
|
235
|
+
# relative_height = 110
|
236
|
+
# relative_margin_top = -15
|
237
|
+
|
238
|
+
= LCD wraps I2C
|
239
|
+
|
240
|
+
# enscript ruby
|
241
|
+
# /lib/lcd.rb in R2P2 drive
|
242
|
+
require 'i2c'
|
243
|
+
class LCD
|
244
|
+
ADDRESS = 0x3e # 0x7c == (0x3e << 1) + 0 (R/W)
|
245
|
+
def initialize(i2c:)
|
246
|
+
@i2c = i2c
|
247
|
+
reset
|
248
|
+
end
|
249
|
+
def reset
|
250
|
+
[0x38, 0x39, 0x14, 0x70, 0x56, 0x6c].each { |i| @i2c.write(ADDRESS, 0, i) }
|
251
|
+
sleep_ms 200
|
252
|
+
[0x38, 0x0c, 0x01].each { |i| @i2c.write(ADDRESS, 0, i) }
|
253
|
+
end
|
254
|
+
def putc(c)
|
255
|
+
@i2c.write(ADDRESS, 0x40, c)
|
256
|
+
sleep_ms 1
|
257
|
+
end
|
258
|
+
def print(line)
|
259
|
+
line.bytes.each { |c| putc c }
|
260
|
+
end
|
261
|
+
# ...
|
262
|
+
# See https://github.com/picoruby/picoruby/tree/master/mrbgems/picoruby-ble/example/broadcaster-observer
|
263
|
+
|
264
|
+
= LCD wraps I2C
|
265
|
+
|
266
|
+
irb> require 'lcd'
|
267
|
+
irb> lcd = LCD.new(i2c: I2C.new(unit: :RP2040_I2C1, sda_pin: 26, scl_pin: 27))
|
268
|
+
irb> lcd.print "Hello,"
|
269
|
+
irb> lcd.break_line
|
270
|
+
irb> lcd.print "Taiwan!"
|
271
|
+
|
272
|
+
\n
|
273
|
+
|
274
|
+
# image
|
275
|
+
# src = images/hello_taiwan.jpg
|
276
|
+
# relative_height = 110
|
277
|
+
# relative_margin_top = -5
|
278
|
+
|
279
|
+
= SPI
|
280
|
+
|
281
|
+
irb> require 'spi'
|
282
|
+
irb> spi = SPI.new(unit: :RP2040_SPI0, cipo_pin: 16,
|
283
|
+
cs_pin: 17, sck_pin: 18, copi_pin: 19)
|
284
|
+
irb> spi.select
|
285
|
+
irb> spi.write(255,255,255,255) # Reset
|
286
|
+
irb> spi.write(0x54) # Start continuous mode
|
287
|
+
irb> data = spi.read(2).bytes
|
288
|
+
irb> temp = data[0] << 8 | data[1]
|
289
|
+
irb> temp / 128.0 # Convert to Celsius
|
290
|
+
=> 19.5621
|
291
|
+
|
292
|
+
= THERMO wraps SPI
|
293
|
+
|
294
|
+
# enscript ruby
|
295
|
+
# /lib/thermo.rb in R2P2 drive
|
296
|
+
require 'spi'
|
297
|
+
class THERMO
|
298
|
+
def initialize(unit:, sck_pin:, cipo_pin:, copi_pin:, cs_pin:)
|
299
|
+
@spi = SPI.new(unit: unit, frequency: 500_000, mode: 0, cs_pin: cs_pin,
|
300
|
+
sck_pin: sck_pin, cipo_pin: cipo_pin, copi_pin: copi_pin
|
301
|
+
)
|
302
|
+
@spi.select
|
303
|
+
@spi.write 0xFF, 0xFF, 0xFF, 0xFF # Reset
|
304
|
+
@spi.write 0x54 # Start continuous mode
|
305
|
+
sleep_ms 240
|
306
|
+
end
|
307
|
+
|
308
|
+
def read
|
309
|
+
data = @spi.read(2).bytes
|
310
|
+
temp = (data[0] << 8 | data[1]) >> 3
|
311
|
+
# If it minus?
|
312
|
+
temp -= 0x2000 if 0 < temp & 0b1_0000_0000_0000
|
313
|
+
temp / 16.0 # Convert to Celsius
|
314
|
+
end
|
315
|
+
end
|
316
|
+
# See https://github.com/picoruby/picoruby/tree/master/mrbgems/picoruby-ble/example/broadcaster-observer
|
317
|
+
|
318
|
+
= THERMO wraps SPI
|
319
|
+
|
320
|
+
irb> require 'thermo'
|
321
|
+
irb> thermo = THERMO.new(unit: :RP2040_SPI0,
|
322
|
+
cipo_pin: 16, cs_pin: 17, sck_pin: 18, copi_pin: 19)
|
323
|
+
irb> thermo.read
|
324
|
+
=> 19.5621
|
325
|
+
|
326
|
+
= LCD and THERMO
|
327
|
+
|
328
|
+
irb> require 'lcd'
|
329
|
+
irb> lcd = LCD.new(i2c: I2C.new(unit: :RP2040_I2C1, sda_pin: 26, scl_pin: 27))
|
330
|
+
irb> require 'thermo'
|
331
|
+
irb> thermo = THERMO.new(unit: :RP2040_SPI0,
|
332
|
+
cipo_pin: 16, cs_pin: 17, sck_pin: 18, copi_pin: 19)
|
333
|
+
irb> lcd.print sprintf("%5.2f \xdfC", thermo.read)
|
334
|
+
|
335
|
+
\n
|
336
|
+
|
337
|
+
# image
|
338
|
+
# src = images/lcd-and-thermo.jpg
|
339
|
+
# relative_height = 115
|
340
|
+
# relative_margin_top = -8
|
341
|
+
|
342
|
+
= UART
|
343
|
+
|
344
|
+
irb> require 'uart'
|
345
|
+
irb> uart = UART.new(unit: :RP2040_UART0, txd_pin: 16, rxd_pin: 17, baudrate: 115200)
|
346
|
+
irb> uart.puts "Hello from Pico!"
|
347
|
+
=> nil
|
348
|
+
irb> while true
|
349
|
+
irb* if c = uart.read
|
350
|
+
irb* uart.write c # Echo back
|
351
|
+
irb* print c
|
352
|
+
irb* end
|
353
|
+
irb* end
|
354
|
+
Hello to Pico! # <= "Hello to Pico!" in UART device
|
355
|
+
|
356
|
+
(('tag:center'))
|
357
|
+
\n
|
358
|
+
You don't need to wrap UART. Use as it is
|
359
|
+
|
360
|
+
= BLE Broadcaster
|
361
|
+
# image
|
362
|
+
# src = images/broadcaster_bb.png
|
363
|
+
# align = right
|
364
|
+
# relative_height = 90
|
365
|
+
# relative_margin_left = 7
|
366
|
+
# draw1 = [text, THERMO, 0.63, 0.09, {color: blue, size: 70, font_family: 'Courier Prime', weight: bold}]
|
367
|
+
|
368
|
+
* Pin assign
|
369
|
+
* 3V3 to {LCD,THERMO}:VCC
|
370
|
+
* GND to {LCD,THERMO}:GND
|
371
|
+
* GPIO16 to THERMO:SDO
|
372
|
+
* GPIO17 to THERMO:CS
|
373
|
+
* GPIO18 to THERMO:SCL
|
374
|
+
* GPIO19 to THERMO:SDI
|
375
|
+
* GPIO26 to LCD:SDA
|
376
|
+
* GPIO27 to LCD:SCL
|
377
|
+
|
378
|
+
= BLE Observer
|
379
|
+
# image
|
380
|
+
# src = images/observer_bb.png
|
381
|
+
# align = right
|
382
|
+
# relative_height = 90
|
383
|
+
# relative_margin_left = 5
|
384
|
+
# draw1 = [text, USB-TTL, 0.33, 0.1, {color: red, size: 70, font_family: 'Courier Prime', weight: bold}]
|
385
|
+
|
386
|
+
* Pin assign
|
387
|
+
* 3V3 to USB-TTL:VCC
|
388
|
+
* GND to USB-TTL:GND
|
389
|
+
* GPIO16 to USB-TTL:RX
|
390
|
+
* GPIO17 to USB-TTL:TX
|
391
|
+
|
392
|
+
= Gems in Broadcaster and Observer
|
393
|
+
|
394
|
+
# in Broadcaster
|
395
|
+
$> ls /lib
|
396
|
+
lcd.rb
|
397
|
+
thermo.rb
|
398
|
+
|
399
|
+
# in Observer
|
400
|
+
$> ls /lib
|
401
|
+
led.rb
|
402
|
+
|
403
|
+
= BLE Broadcaster
|
404
|
+
|
405
|
+
# enscript ruby
|
406
|
+
# /home/app.rb in R2P2 drive
|
407
|
+
class DemoBroadcaster < BLE::Broadcaster
|
408
|
+
def initialize
|
409
|
+
super(nil)
|
410
|
+
led = CYW43::GPIO.new(CYW43::GPIO::LED_PIN)
|
411
|
+
@lcd = LCD.new(i2c: I2C.new(unit: :RP2040_I2C1, sda_pin: 26, scl_pin: 27))
|
412
|
+
@thermo = THERMO.new(unit: :RP2040_SPI0, cipo_pin: 16, cs_pin: 17, sck_pin: 18, copi_pin: 19)
|
413
|
+
@counter = 0
|
414
|
+
end
|
415
|
+
def adv_data(send_data)
|
416
|
+
BLE::AdvertisingData.build do |adv|
|
417
|
+
adv.add(0x01, 0xFF)
|
418
|
+
adv.add(0x09, "PicoRuby")
|
419
|
+
adv.add(0xFF, send_data)
|
420
|
+
end
|
421
|
+
end
|
422
|
+
def heartbeat_callback
|
423
|
+
Machine.using_delay do
|
424
|
+
temperature = @thermo.read
|
425
|
+
@lcd.clear
|
426
|
+
@lcd.print sprintf("%5.2f \xdfC", temperature)
|
427
|
+
@lcd.break_line
|
428
|
+
@lcd.print "+" * (@counter % 9)
|
429
|
+
advertise(adv_data (temperature * 100).to_i.to_s)
|
430
|
+
end
|
431
|
+
@counter += 1
|
432
|
+
Watchdog.update
|
433
|
+
end
|
434
|
+
def packet_callback(event_packet)
|
435
|
+
case event_packet[0]&.ord # event type
|
436
|
+
when 0x60 # BTSTACK_EVENT_STATE
|
437
|
+
return unless event_packet[2]&.ord == BLE::HCI_STATE_WORKING
|
438
|
+
@state = :HCI_STATE_WORKING
|
439
|
+
Watchdog.enable(2000)
|
440
|
+
end
|
441
|
+
end
|
442
|
+
end
|
443
|
+
DemoBroadcaster.new.start
|
444
|
+
# See https://github.com/picoruby/picoruby/tree/master/mrbgems/picoruby-ble/example/broadcaster-observer
|
445
|
+
|
446
|
+
= BLE Observer
|
447
|
+
|
448
|
+
# enscript ruby
|
449
|
+
# /home/app.rb in R2P2 drive
|
450
|
+
class DemoObserver < BLE::Observer
|
451
|
+
def initialize
|
452
|
+
super
|
453
|
+
@led = LED.new
|
454
|
+
@uart = UART.new(unit: :RP2040_UART0, txd_pin: 16, rxd_pin: 17, baudrate: 115200)
|
455
|
+
@uart.puts 'Start BLE Observer Demo'
|
456
|
+
@last_time_found = Time.now.to_i
|
457
|
+
Watchdog.enable(4000)
|
458
|
+
end
|
459
|
+
def advertising_report_callback(adv_report)
|
460
|
+
if adv_report&.reports[:complete_local_name] == 'PicoRuby'
|
461
|
+
now = Time.now.to_i
|
462
|
+
if 2 < now - @last_time_found
|
463
|
+
@uart.puts sprintf("%5.2f degC", adv_report.reports[:manufacturer_specific_data].to_f / 100)
|
464
|
+
@last_time_found = now
|
465
|
+
end
|
466
|
+
end
|
467
|
+
end
|
468
|
+
def heartbeat_callback
|
469
|
+
Watchdog.update
|
470
|
+
@led.invert
|
471
|
+
end
|
472
|
+
end
|
473
|
+
DemoObserver.new.scan(stop_state: :no_stop)
|
474
|
+
# See https://github.com/picoruby/picoruby/tree/master/mrbgems/picoruby-ble/example/broadcaster-observer
|
475
|
+
|
476
|
+
= Real world application
|
477
|
+
|
478
|
+
# image
|
479
|
+
# src = images/kamos-2023.jpg
|
480
|
+
# relative_height = 100
|
481
|
+
|
482
|
+
= Wrap up
|
483
|
+
|
484
|
+
* PicoRuby is a Ruby implementaiton targeting on one-chip microcontroller
|
485
|
+
* Built-in peripheral gems for general IOs:\nGPIO, I2C, SPI, UART, ADC, and PWM are ready
|
486
|
+
* You can incrementally write your device drivers and applications with PicoIRB
|
487
|
+
* BLE gem is also almost ready for real applications
|
488
|
+
|
489
|
+
= chapter
|
490
|
+
(('tag:x-large:stargaze at'))
|
491
|
+
# image
|
492
|
+
# src = images/QR_picoruby.png
|
493
|
+
# relative_height = 80
|
494
|
+
(('tag:center'))github.com/picoruby/picoruby
|
495
|
+
== prop
|
496
|
+
: hide-title
|
497
|
+
true
|
498
|
+
|
499
|
+
= chapter
|
500
|
+
(('tag:x-large:may the'))
|
501
|
+
\n
|
502
|
+
(('tag:xx-large:source'))
|
503
|
+
\n
|
504
|
+
(('tag:x-large:be with you'))
|
505
|
+
== prop
|
506
|
+
: hide-title
|
507
|
+
true
|
508
|
+
|
data/README.rd
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
= PicoRuby epsode 4
|
2
|
+
|
3
|
+
Presentation slide for RubyConf Taiwan 2023
|
4
|
+
|
5
|
+
== For author
|
6
|
+
|
7
|
+
=== Show
|
8
|
+
|
9
|
+
rake
|
10
|
+
|
11
|
+
=== Publish
|
12
|
+
|
13
|
+
rake publish
|
14
|
+
|
15
|
+
== For viewers
|
16
|
+
|
17
|
+
=== Install
|
18
|
+
|
19
|
+
gem install rabbit-slide-hasumikin-RubyConfTaiwan2023
|
20
|
+
|
21
|
+
=== Show
|
22
|
+
|
23
|
+
rabbit rabbit-slide-hasumikin-RubyConfTaiwan2023.gem
|
24
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require "rabbit/task/slide"
|
2
|
+
|
3
|
+
# Edit ./config.yaml to customize meta data
|
4
|
+
|
5
|
+
spec = nil
|
6
|
+
Rabbit::Task::Slide.new do |task|
|
7
|
+
spec = task.spec
|
8
|
+
# spec.files += Dir.glob("doc/**/*.*")
|
9
|
+
# spec.files -= Dir.glob("private/**/*.*")
|
10
|
+
# spec.add_runtime_dependency("rabbit-theme-YOUR-THEME")
|
11
|
+
end
|
12
|
+
|
13
|
+
desc "Tag #{spec.version}"
|
14
|
+
task :tag do
|
15
|
+
sh("git", "tag", "-a", spec.version.to_s, "-m", "Publish #{spec.version}")
|
16
|
+
sh("git", "push", "--tags")
|
17
|
+
end
|
data/config.yaml
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
---
|
2
|
+
id: RubyConfTaiwan2023
|
3
|
+
base_name: PicoRuby_ep4
|
4
|
+
tags:
|
5
|
+
- PicoRuby
|
6
|
+
- Peripheral
|
7
|
+
- Microcontroller
|
8
|
+
presentation_date: '2023-12-15'
|
9
|
+
presentation_start_time:
|
10
|
+
presentation_end_time:
|
11
|
+
version: 2023.12.15.0
|
12
|
+
licenses: ["MIT"]
|
13
|
+
slideshare_id:
|
14
|
+
speaker_deck_id:
|
15
|
+
ustream_id:
|
16
|
+
vimeo_id:
|
17
|
+
youtube_id:
|
18
|
+
author:
|
19
|
+
markup_language: :rd
|
20
|
+
name: HASUMI Hitoshi
|
21
|
+
email: hasumikin@gmail.com
|
22
|
+
rubygems_user: hasumikin
|
23
|
+
slideshare_user:
|
24
|
+
speaker_deck_user:
|
data/images/QR_R2P2.png
ADDED
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/images/hasumi.jpg
ADDED
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/images/mark_g.png
ADDED
Binary file
|
data/images/mark_y.png
ADDED
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/images/setup.jpg
ADDED
Binary file
|
Binary file
|
data/images/teraterm.png
ADDED
Binary file
|
Binary file
|
Binary file
|
data/theme.rb
ADDED
@@ -0,0 +1,182 @@
|
|
1
|
+
# puts font_families.sort
|
2
|
+
@xxx_large_font_size = screen_size(22 * Pango::SCALE)
|
3
|
+
@xx_large_font_size = screen_size(18 * Pango::SCALE)
|
4
|
+
@x_large_font_size = screen_size(11 * Pango::SCALE)
|
5
|
+
@large_font_size = screen_size(7.5 * Pango::SCALE)
|
6
|
+
@normal_font_size = screen_size(5 * Pango::SCALE)
|
7
|
+
@small_font_size = screen_size(4.5 * Pango::SCALE)
|
8
|
+
@x_small_font_size = screen_size(3.5 * Pango::SCALE)
|
9
|
+
@xx_small_font_size = screen_size(3 * Pango::SCALE)
|
10
|
+
|
11
|
+
@font_family = find_font_family('Franklin Gothic Medium')
|
12
|
+
@monospace_font_family = 'Ricty Discord'
|
13
|
+
@title_font_family = find_font_family('Star Jedi Hollow')
|
14
|
+
|
15
|
+
@default_headline_line_color = '#ffff00'
|
16
|
+
@default_headline_line_width = 2
|
17
|
+
@default_headline_line_expand = false
|
18
|
+
|
19
|
+
@default_emphasis_color = "#ff0000"
|
20
|
+
@default_emphasis_level2_color = "#ffffff"
|
21
|
+
|
22
|
+
set_graffiti_color "#FF2B22"
|
23
|
+
set_graffiti_line_width 5
|
24
|
+
|
25
|
+
#@table_frame_color = "#ffffff"
|
26
|
+
#@table_fill_color = "#0f0428"
|
27
|
+
#@table_body_frame_color = "#ffffff"
|
28
|
+
#@table_body_fill_color = "#3f3468"
|
29
|
+
#@table_head_frame_color = "#ffffff"
|
30
|
+
#@table_head_fill_color = "#rf0428"
|
31
|
+
|
32
|
+
@preformatted_fill_color = '#000000'
|
33
|
+
# @preformatted_centering = true
|
34
|
+
@space = screen_y(1)
|
35
|
+
|
36
|
+
# @margin_left = 300
|
37
|
+
|
38
|
+
@image_slide_number_start_flag_color = "#53575a"
|
39
|
+
@image_slide_number_goal_flag_color = "#a81313"
|
40
|
+
|
41
|
+
#@slide_headline_hide = true
|
42
|
+
|
43
|
+
@slide_background_image = 'images/star-background.jpg'
|
44
|
+
include_theme("slide-background-image")
|
45
|
+
|
46
|
+
@title_slide_background_image = 'images/star-background.jpg'
|
47
|
+
include_theme("title-slide-background-image")
|
48
|
+
|
49
|
+
include_theme('default')
|
50
|
+
|
51
|
+
match(Slide, HeadLine) do |heads|
|
52
|
+
#heads.prop_set("size", 0)
|
53
|
+
heads.prop_set("weight", "normal")
|
54
|
+
set_font_family(heads)
|
55
|
+
end
|
56
|
+
match(Slide) do |slides|
|
57
|
+
slides.prop_set("foreground", "#ffff00")
|
58
|
+
end
|
59
|
+
|
60
|
+
match TitleSlide do |slides|
|
61
|
+
slides.margin_left = @margin_right
|
62
|
+
slides.prop_set("foreground", "#ffff00")
|
63
|
+
end
|
64
|
+
match TitleSlide, Title do |elem|
|
65
|
+
elem.margin_top = -120
|
66
|
+
elem.prop_set "size", @xxx_large_font_size
|
67
|
+
elem.prop_set "font-family", @title_font_family
|
68
|
+
elem.prop_set "weight", "normal"
|
69
|
+
end
|
70
|
+
match TitleSlide, Subtitle do |elem|
|
71
|
+
elem.prop_set "size", @normal_font_size
|
72
|
+
elem.margin_top = -110
|
73
|
+
end
|
74
|
+
match TitleSlide, Author do |elem|
|
75
|
+
elem.margin_top = -180
|
76
|
+
elem.prop_set "size", @xxx_large_font_size
|
77
|
+
elem.prop_set "font-family", @title_font_family
|
78
|
+
end
|
79
|
+
match TitleSlide, ContentSource do |elem|
|
80
|
+
elem.margin_top = -80
|
81
|
+
elem.prop_set "size", @small_font_size
|
82
|
+
elem.prop_set "style", "normal"
|
83
|
+
end
|
84
|
+
match TitleSlide, Place do |elem|
|
85
|
+
elem.prop_set "size", @xx_small_font_size
|
86
|
+
elem.prop_set "style", "normal"
|
87
|
+
end
|
88
|
+
match TitleSlide, Date do |elem|
|
89
|
+
elem.prop_set "size", @xx_small_font_size
|
90
|
+
elem.prop_set "style", "normal"
|
91
|
+
end
|
92
|
+
match TitleSlide, Institution do |elem|
|
93
|
+
elem.margin_top = 50
|
94
|
+
elem.prop_set "size", @x_small_font_size
|
95
|
+
elem.prop_set "style", "normal"
|
96
|
+
end
|
97
|
+
|
98
|
+
#@slide_logo_image = 'images/mark_g.png'
|
99
|
+
#include_theme('slide-logo')
|
100
|
+
|
101
|
+
@item_image_1 = 'images/r2d2_icon-icons.com_76952.png'
|
102
|
+
@item_image_2 = 'images/c3p0_icon-icons.com_76936.png'
|
103
|
+
@item_image_3 = 'images/ewok_icon-icons.com_76943.png'
|
104
|
+
|
105
|
+
include_theme("default-item-mark")
|
106
|
+
|
107
|
+
add_image_path("rabbit-images")
|
108
|
+
|
109
|
+
slide_body = [Slide, Body]
|
110
|
+
item_list_item = [ItemList, ItemListItem]
|
111
|
+
|
112
|
+
indent = 50
|
113
|
+
|
114
|
+
match(*(slide_body + (item_list_item * 1))) do |items|
|
115
|
+
name = "item1"
|
116
|
+
items.delete_pre_draw_proc_by_name(name)
|
117
|
+
items.delete_post_draw_proc_by_name(name)
|
118
|
+
draw_image_mark(items, @item_image_1, name, indent: indent)
|
119
|
+
end
|
120
|
+
|
121
|
+
match(*(slide_body + (item_list_item * 2))) do |items|
|
122
|
+
name = "item2"
|
123
|
+
items.delete_pre_draw_proc_by_name(name)
|
124
|
+
items.delete_post_draw_proc_by_name(name)
|
125
|
+
draw_image_mark(items, @item_image_2, name, indent: indent)
|
126
|
+
end
|
127
|
+
|
128
|
+
match(*(slide_body + (item_list_item * 3))) do |items|
|
129
|
+
name = "item3"
|
130
|
+
items.delete_pre_draw_proc_by_name(name)
|
131
|
+
items.delete_post_draw_proc_by_name(name)
|
132
|
+
draw_image_mark(items, @item_image_3, name, indent: indent)
|
133
|
+
end
|
134
|
+
|
135
|
+
enum_list_item = [EnumList, EnumListItem]
|
136
|
+
|
137
|
+
match(*(slide_body + enum_list_item + item_list_item)) do |items|
|
138
|
+
name = "enum-item1"
|
139
|
+
items.delete_pre_draw_proc_by_name(name)
|
140
|
+
items.delete_post_draw_proc_by_name(name)
|
141
|
+
draw_image_mark(items, @item_image_1, name, indent: indent)
|
142
|
+
end
|
143
|
+
|
144
|
+
match(*(slide_body + enum_list_item + (item_list_item * 2))) do |items|
|
145
|
+
name = "enum-item2"
|
146
|
+
items.delete_pre_draw_proc_by_name(name)
|
147
|
+
items.delete_post_draw_proc_by_name(name)
|
148
|
+
draw_image_mark(items, @item_image_2, name, indent: indent)
|
149
|
+
end
|
150
|
+
|
151
|
+
# table
|
152
|
+
all_table = ["**", Table]
|
153
|
+
match(*(all_table + [TableBody, TableRow, TableCell])) do |cells|
|
154
|
+
set_font_family(cells, @monospace_font_family)
|
155
|
+
end
|
156
|
+
match(*(all_table + [TableHead, TableRow, TableHeader])) do |headers|
|
157
|
+
set_font_family(headers, @monospace_font_family)
|
158
|
+
end
|
159
|
+
|
160
|
+
match("**", Emphasis, Emphasis) do |texts|
|
161
|
+
texts.prop_set("foreground", @default_emphasis_level2_color)
|
162
|
+
texts.prop_set("weight", "normal")
|
163
|
+
end
|
164
|
+
|
165
|
+
# Chapter
|
166
|
+
match Slide do |slides|
|
167
|
+
slides.each do |slide|
|
168
|
+
if slide.match?(/sub_chapter/)
|
169
|
+
slide.horizontal_centering = true
|
170
|
+
elsif slide.match?(/chapter/)
|
171
|
+
set_font_family slide, @title_font_family
|
172
|
+
slide.horizontal_centering = true
|
173
|
+
elsif slide.match?(/cite/)
|
174
|
+
slide.prop_set "foreground", "#222222"
|
175
|
+
slide.horizontal_centering = true
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
match("**", PreformattedBlock) do |blocks|
|
181
|
+
blocks.prop_set("foreground", "#00FFAF")
|
182
|
+
end
|
metadata
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rabbit-slide-hasumikin-RubyConfTaiwan2023
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 2023.12.15.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- HASUMI Hitoshi
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-12-20 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rabbit
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 2.0.2
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 2.0.2
|
27
|
+
description: Presentation slide for RubyConf Taiwan 2023
|
28
|
+
email:
|
29
|
+
- hasumikin@gmail.com
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- ".rabbit"
|
35
|
+
- PicoRuby_ep4.rab
|
36
|
+
- README.rd
|
37
|
+
- Rakefile
|
38
|
+
- config.yaml
|
39
|
+
- images/QR_R2P2.png
|
40
|
+
- images/QR_picoruby.png
|
41
|
+
- images/QR_prk_firmware.png
|
42
|
+
- images/R2D2_mosaic.png
|
43
|
+
- images/boot_button_1.png
|
44
|
+
- images/broadcaster_bb.png
|
45
|
+
- images/c3p0_icon-icons.com_76936.png
|
46
|
+
- images/disable-bluetooth.jpg
|
47
|
+
- images/download-r2p2.png
|
48
|
+
- images/ewok_icon-icons.com_76943.png
|
49
|
+
- images/hasumi.jpg
|
50
|
+
- images/hello_taiwan.jpg
|
51
|
+
- images/install-uf2.png
|
52
|
+
- images/kamos-2023.jpg
|
53
|
+
- images/lcd-and-thermo.jpg
|
54
|
+
- images/mark_g.png
|
55
|
+
- images/mark_y.png
|
56
|
+
- images/observer_bb.png
|
57
|
+
- images/pico-and-pico_w.jpg
|
58
|
+
- images/r2d2_icon-icons.com_76952.png
|
59
|
+
- images/setup.jpg
|
60
|
+
- images/star-background.jpg
|
61
|
+
- images/teraterm.png
|
62
|
+
- images/title-background.png
|
63
|
+
- pdf/RubyConfTaiwan2023-PicoRuby_ep4.pdf
|
64
|
+
- theme.rb
|
65
|
+
homepage: https://slide.rabbit-shocker.org/authors/hasumikin/RubyConfTaiwan2023/
|
66
|
+
licenses:
|
67
|
+
- MIT
|
68
|
+
metadata: {}
|
69
|
+
post_install_message:
|
70
|
+
rdoc_options: []
|
71
|
+
require_paths:
|
72
|
+
- lib
|
73
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
requirements: []
|
84
|
+
rubygems_version: 3.4.13
|
85
|
+
signing_key:
|
86
|
+
specification_version: 4
|
87
|
+
summary: PicoRuby epsode 4
|
88
|
+
test_files: []
|