pi_piper 1.3.2 → 1.9.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +4 -0
- data/.rspec +3 -0
- data/.travis.yml +8 -0
- data/Gemfile +8 -0
- data/Gemfile.lock +65 -0
- data/Manifest +5 -0
- data/README.md +54 -8
- data/Rakefile +24 -14
- data/examples/2_bit_counter/2_bit_counter.rb +22 -0
- data/examples/7-segment/7-segment.rb +37 -0
- data/examples/dsl_switch/dsl_switch.rb +15 -0
- data/examples/mcp3008/circuit.png +0 -0
- data/examples/mcp3008/mcp3008.rb +55 -0
- data/examples/mcp3008_spi/mcp3008_spi.rb +24 -0
- data/examples/morse_code/circuit.png +0 -0
- data/examples/morse_code/morse_code.rb +43 -0
- data/examples/simple_switch/circuit.png +0 -0
- data/examples/simple_switch/simple_switch.rb +10 -0
- data/lib/pi_piper.rb +38 -5
- data/lib/pi_piper/bcm2835.rb +85 -3
- data/lib/pi_piper/frequency.rb +19 -0
- data/lib/pi_piper/i2c.rb +51 -0
- data/lib/pi_piper/libbcm2835.so +0 -0
- data/lib/pi_piper/pin.rb +129 -38
- data/lib/pi_piper/pin_error.rb +3 -0
- data/lib/pi_piper/pin_values.rb +10 -0
- data/lib/pi_piper/platform.rb +25 -0
- data/lib/pi_piper/spi.rb +47 -43
- data/lib/pi_piper/stub_driver.rb +107 -0
- data/pi_piper.gemspec +18 -7
- data/spec/i2c_spec.rb +83 -0
- data/spec/pin_spec.rb +149 -0
- data/spec/pull_mode_spec.rb +70 -0
- data/spec/spec_helper.rb +7 -0
- data/spec/spi_spec.rb +44 -0
- data/spec/stub_driver_spec.rb +140 -0
- metadata +107 -14
- data/lib/pi_piper/libbcm2835.img +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 13fdeb8e5268450e6f5e16b76fadd8c86c21d14e
|
4
|
+
data.tar.gz: 0cf0fc4609e69c32a9f2fe67eb6b581a9959d021
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 87894270c282f9368be74074bd7872cd5fd3ce9e26f961cb5cace37a8599cb8ac5aef5c4fcd03368274800cb37da9a10d21012cae8b2a8db0461e3577b77f6f8
|
7
|
+
data.tar.gz: 51bc8cec9b89c1005881a20277543242e458c56c7e2e495daa32d46bdff5af3ab5671b7553d7ce66904d6d121ad76bccae618d2f4d65790d6524b1d332920c6c
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
pi_piper (2.0.beta.11)
|
5
|
+
eventmachine (= 1.0.9)
|
6
|
+
ffi
|
7
|
+
|
8
|
+
GEM
|
9
|
+
remote: https://rubygems.org/
|
10
|
+
specs:
|
11
|
+
allison (2.0.3)
|
12
|
+
diff-lcs (1.2.4)
|
13
|
+
echoe (4.6.3)
|
14
|
+
allison (>= 2.0.3)
|
15
|
+
gemcutter (>= 0.7.0)
|
16
|
+
rake (>= 0.9.2)
|
17
|
+
rdoc (>= 3.6.1)
|
18
|
+
rubyforge (>= 2.0.4)
|
19
|
+
eventmachine (1.0.9)
|
20
|
+
ffi (1.9.0)
|
21
|
+
gemcutter (0.7.1)
|
22
|
+
json (1.8.1)
|
23
|
+
json_pure (1.8.1)
|
24
|
+
metaclass (0.0.1)
|
25
|
+
mocha (0.14.0)
|
26
|
+
metaclass (~> 0.0.1)
|
27
|
+
multi_json (1.8.2)
|
28
|
+
rake (10.1.0)
|
29
|
+
rdoc (4.0.1)
|
30
|
+
json (~> 1.4)
|
31
|
+
rspec (3.4.0)
|
32
|
+
rspec-core (~> 3.4.0)
|
33
|
+
rspec-expectations (~> 3.4.0)
|
34
|
+
rspec-mocks (~> 3.4.0)
|
35
|
+
rspec-core (3.4.1)
|
36
|
+
rspec-support (~> 3.4.0)
|
37
|
+
rspec-expectations (3.4.0)
|
38
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
39
|
+
rspec-support (~> 3.4.0)
|
40
|
+
rspec-mocks (3.4.1)
|
41
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
42
|
+
rspec-support (~> 3.4.0)
|
43
|
+
rspec-support (3.4.1)
|
44
|
+
rubyforge (2.0.4)
|
45
|
+
json_pure (>= 1.1.7)
|
46
|
+
simplecov (0.7.1)
|
47
|
+
multi_json (~> 1.0)
|
48
|
+
simplecov-html (~> 0.7.1)
|
49
|
+
simplecov-html (0.7.1)
|
50
|
+
|
51
|
+
PLATFORMS
|
52
|
+
ruby
|
53
|
+
|
54
|
+
DEPENDENCIES
|
55
|
+
echoe
|
56
|
+
eventmachine (~> 1.0.9)
|
57
|
+
ffi
|
58
|
+
mocha
|
59
|
+
pi_piper!
|
60
|
+
rake
|
61
|
+
rspec
|
62
|
+
simplecov
|
63
|
+
|
64
|
+
BUNDLED WITH
|
65
|
+
1.11.2
|
data/Manifest
CHANGED
@@ -1,9 +1,14 @@
|
|
1
|
+
Gemfile
|
2
|
+
Gemfile.lock
|
1
3
|
Manifest
|
2
4
|
README.md
|
3
5
|
Rakefile
|
4
6
|
lib/pi_piper.rb
|
5
7
|
lib/pi_piper/bcm2835.rb
|
8
|
+
lib/pi_piper/frequency.rb
|
9
|
+
lib/pi_piper/i2c.rb
|
6
10
|
lib/pi_piper/libbcm2835.img
|
7
11
|
lib/pi_piper/pin.rb
|
12
|
+
lib/pi_piper/platform.rb
|
8
13
|
lib/pi_piper/spi.rb
|
9
14
|
pi_piper.gemspec
|
data/README.md
CHANGED
@@ -1,14 +1,16 @@
|
|
1
1
|
## Overview
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
[![Build Status](https://travis-ci.org/jwhitehorn/pi_piper.png)](https://travis-ci.org/jwhitehorn/pi_piper)
|
4
|
+
|
5
|
+
Pi Piper brings event driven programming to the Raspberry Pi's GPIO pins. Pi Piper works with all revisions of the Raspberry Pi,
|
6
|
+
and has been tested with Ruby 1.9.3 & 2.0 under both [Raspbian "wheezy"](http://www.raspberrypi.org/downloads) and [Occidentalis v0.2](http://learn.adafruit.com/adafruit-raspberry-pi-educational-linux-distro/occidentalis-v0-dot-2).
|
5
7
|
|
6
8
|
To get started:
|
7
9
|
|
8
10
|
If you do not already have Ruby installed, first you'll need to:
|
9
|
-
|
11
|
+
|
10
12
|
sudo apt-get install ruby ruby1.9.1-dev
|
11
|
-
|
13
|
+
|
12
14
|
Despite one of the packages being titled "ruby1.9.1-dev", the above command will install Ruby 1.9.3 (as of January 2013) and the Ruby dev tools.
|
13
15
|
|
14
16
|
To install Pi Piper:
|
@@ -38,6 +40,22 @@ PiPiper.wait
|
|
38
40
|
|
39
41
|
Your block will be called when a change to the pin's state is detected.
|
40
42
|
|
43
|
+
When using pins as input, you can use internal resistors to pull the pin
|
44
|
+
up or pull down. This is important if you use open-collector sensors
|
45
|
+
which have floating output in some states.
|
46
|
+
|
47
|
+
You can set resistors when creating a pin passing a :pull parameter
|
48
|
+
(which can be :up, :down or :off, which is the default).
|
49
|
+
|
50
|
+
```ruby
|
51
|
+
pin = PiPiper::Pin.new(:pin => 17, :direction => :in, :pull => :up)
|
52
|
+
```
|
53
|
+
|
54
|
+
This way, the pin will always return 'on' if it is unconnected or of the
|
55
|
+
sensor has an open collector output.
|
56
|
+
|
57
|
+
You can later alter the pulling resistors using PiPiper#pull!
|
58
|
+
|
41
59
|
Additionally you can use pins as output too:
|
42
60
|
|
43
61
|
```ruby
|
@@ -47,15 +65,26 @@ sleep 1
|
|
47
65
|
pin.off
|
48
66
|
```
|
49
67
|
|
68
|
+
_please note, in the above context "pin" refers to the GPIO number of the Raspberry Pi._
|
69
|
+
|
50
70
|
### SPI
|
51
|
-
Starting with version 1.2, Pi Piper offers SPI support.
|
71
|
+
Starting with version 1.2, Pi Piper offers SPI support.
|
52
72
|
|
53
73
|
```ruby
|
54
|
-
PiPiper::Spi.begin do
|
55
|
-
puts write [0x01, 0x80, 0x00]
|
74
|
+
PiPiper::Spi.begin do
|
75
|
+
puts write [0x01, 0x80, 0x00]
|
56
76
|
end
|
57
77
|
```
|
58
78
|
|
79
|
+
If you are using an operating system that supports `/dev/spidev0.0` like the [adafruit
|
80
|
+
distro][adafruit-linux] you can also write to the spi using `PiPiper::Spi.spidev_out`
|
81
|
+
|
82
|
+
```ruby
|
83
|
+
# Example writing red, green, blue to a string of WS2801 pixels
|
84
|
+
PiPiper::Spi.spidev_out([255,0,0,0,255,0,0,0,255])
|
85
|
+
```
|
86
|
+
[adafruit-linux]:http://learn.adafruit.com/adafruit-raspberry-pi-educational-linux-distro/overview
|
87
|
+
|
59
88
|
## Documentation
|
60
89
|
|
61
90
|
API documentation for Pi Piper can be found at [rdoc.info](http://rdoc.info/github/jwhitehorn/pi_piper/frames/).
|
@@ -69,9 +98,26 @@ Looking for more examples/sample code for Pi Piper? Then check out the following
|
|
69
98
|
* [Project 3: 2-bit counter](https://github.com/jwhitehorn/pi_piper/wiki/Project-3:-2-bit-counter)
|
70
99
|
* [Project 4: MCP3008](https://github.com/jwhitehorn/pi_piper/wiki/Project-4:-MCP3008)
|
71
100
|
|
101
|
+
## Under the hood
|
102
|
+
|
103
|
+
PiPiper use the libbcm2835 library from Mike McCauley at airspayce.
|
104
|
+
|
105
|
+
http://www.airspayce.com/mikem/bcm2835/index.html
|
106
|
+
|
107
|
+
if you want to upgrade or downgrade the library for compatibility reason, get it and make it a shared object library :
|
108
|
+
|
109
|
+
```script
|
110
|
+
wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.49.tar.gz
|
111
|
+
tar zxvf bcm2835-1.49.tar.gz && cd bcm2835-1.49
|
112
|
+
./configure && make
|
113
|
+
sudo make check
|
114
|
+
sudo make install
|
115
|
+
cd src && cc -shared bcm2835.o -o libbcm2835.so
|
116
|
+
cp libbcm2835.so ~/pi_piper/lib/pi_piper
|
117
|
+
|
72
118
|
## License
|
73
119
|
|
74
|
-
Copyright (c) 2013, [Jason Whitehorn](https://github.com/jwhitehorn)
|
120
|
+
Copyright (c) 2013, [Jason Whitehorn](https://github.com/jwhitehorn)
|
75
121
|
All rights reserved.
|
76
122
|
|
77
123
|
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
data/Rakefile
CHANGED
@@ -1,14 +1,24 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'rake'
|
3
|
-
require 'echoe'
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'echoe'
|
4
|
+
require 'rspec/core/rake_task'
|
5
|
+
|
6
|
+
#rake manifest
|
7
|
+
#rake build_gemspec
|
8
|
+
#gem build pi_piper.gemspec
|
9
|
+
#gem push xxx.gem
|
10
|
+
|
11
|
+
Echoe.new('pi_piper', '2.0.beta.4') do |p|
|
12
|
+
p.description = "Event driven Raspberry Pi GPIO library"
|
13
|
+
p.url = "http://github.com/jwhitehorn/pi_piper"
|
14
|
+
p.author = "Jason Whitehorn"
|
15
|
+
p.email = "jason.whitehorn@gmail.com"
|
16
|
+
p.ignore_pattern = ["examples/**/*", "spec/**/*"]
|
17
|
+
p.dependencies = ['ffi', 'eventmachine 1.0.3']
|
18
|
+
end
|
19
|
+
|
20
|
+
Dir["#{File.dirname(__FILE__)}/tasks/*.rake"].sort.each { |ext| load ext }
|
21
|
+
|
22
|
+
RSpec::Core::RakeTask.new(:spec)
|
23
|
+
|
24
|
+
task :default => :spec
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'pi_piper'
|
2
|
+
|
3
|
+
puts "Press the switch to get started"
|
4
|
+
pin17 = PiPiper::Pin.new(:pin => 17, :direction => :out)
|
5
|
+
pin27 = PiPiper::Pin.new(:pin => 27, :direction => :out)
|
6
|
+
|
7
|
+
pin17.off
|
8
|
+
pin27.off
|
9
|
+
|
10
|
+
sum = 0
|
11
|
+
|
12
|
+
PiPiper.watch :pin => 22, :trigger => :rising do |pin|
|
13
|
+
sum = sum + 1
|
14
|
+
display = sum % 4
|
15
|
+
puts sum
|
16
|
+
|
17
|
+
pin17.update_value(display == 2 || display == 3)
|
18
|
+
pin27.update_value(display == 1 || display == 3)
|
19
|
+
end
|
20
|
+
|
21
|
+
PiPiper.wait
|
22
|
+
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'pi_piper'
|
2
|
+
|
3
|
+
s1 = PiPiper::Pin.new(:direction => :out, :pin => 27)
|
4
|
+
s2 = PiPiper::Pin.new(:direction => :out, :pin => 24)
|
5
|
+
s3 = PiPiper::Pin.new(:direction => :out, :pin => 23)
|
6
|
+
s4 = PiPiper::Pin.new(:direction => :out, :pin => 25)
|
7
|
+
s5 = PiPiper::Pin.new(:direction => :out, :pin => 18)
|
8
|
+
s6 = PiPiper::Pin.new(:direction => :out, :pin => 22)
|
9
|
+
s7 = PiPiper::Pin.new(:direction => :out, :pin => 17)
|
10
|
+
|
11
|
+
|
12
|
+
pins = [s1, s2, s3, s4, s5, s6, s7]
|
13
|
+
|
14
|
+
zero = Proc.new { s1.on; s2.on; s3.on; s4.on; s5.on; s6.on; s7.off; }
|
15
|
+
one = Proc.new { s1.off; s2.off; s3.on; s4.on; s5.off; s6.off; s7.off; }
|
16
|
+
two = Proc.new { s1.off; s2.on; s3.on; s4.off; s5.on; s6.on; s7.on; }
|
17
|
+
three = Proc.new { s1.off; s2.on; s3.on; s4.on; s5.on; s6.off; s7.on; }
|
18
|
+
four = Proc.new { s1.on; s2.off; s3.on; s4.on;; s5.off; s6.off; s7.on; }
|
19
|
+
five = Proc.new { s1.on; s2.on; s3.off; s4.on; s5.on; s6.off; s7.on; }
|
20
|
+
six = Proc.new { s1.on; s2.on; s3.off; s4.on; s5.on; s6.on; s7.on; }
|
21
|
+
seven = Proc.new { s1.off; s2.on; s3.on; s4.on; s5.off; s6.off; s7.off; }
|
22
|
+
eight = Proc.new { s1.on; s2.on; s3.on; s4.on; s5.on; s6.on; s7.on; }
|
23
|
+
nine = Proc.new { s1.on; s2.on; s3.on; s4.on; s5.off; s6.off; s7.on; }
|
24
|
+
|
25
|
+
numbers = [zero, one, two, three, four, five, six, seven, eight, nine]
|
26
|
+
|
27
|
+
pins.each { |p| p.off }
|
28
|
+
|
29
|
+
PiPiper.watch :pin => 4, :trigger => :rising do
|
30
|
+
(0..250).each do
|
31
|
+
pins.each { |p| p.update_value(Random.rand(2) == 1) }
|
32
|
+
end
|
33
|
+
number = Random.rand(10)
|
34
|
+
numbers[number].call
|
35
|
+
end
|
36
|
+
|
37
|
+
PiPiper.wait
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'pi_piper'
|
2
|
+
include PiPiper
|
3
|
+
|
4
|
+
puts "Press the switch to get started"
|
5
|
+
|
6
|
+
watch :pin => 17, :invert => true do
|
7
|
+
puts "Pin changed from #{last_value} to #{value}"
|
8
|
+
end
|
9
|
+
|
10
|
+
after :pin => 17, :goes => :high do
|
11
|
+
puts "ouch!"
|
12
|
+
end
|
13
|
+
|
14
|
+
PiPiper.wait
|
15
|
+
|
Binary file
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'pi_piper'
|
2
|
+
#port of the Adafruit MCP3008 interface code found @ http://learn.adafruit.com/send-raspberry-pi-data-to-cosm/python-script
|
3
|
+
|
4
|
+
def read_adc(adc_pin, clockpin, adc_in, adc_out, cspin)
|
5
|
+
cspin.on
|
6
|
+
clockpin.off
|
7
|
+
cspin.off
|
8
|
+
|
9
|
+
command_out = adc_pin
|
10
|
+
command_out |= 0x18
|
11
|
+
command_out <<= 3
|
12
|
+
|
13
|
+
(0..4).each do
|
14
|
+
adc_in.update_value((command_out & 0x80) > 0)
|
15
|
+
command_out <<= 1
|
16
|
+
clockpin.on
|
17
|
+
clockpin.off
|
18
|
+
end
|
19
|
+
result = 0
|
20
|
+
|
21
|
+
(0..11).each do
|
22
|
+
clockpin.on
|
23
|
+
clockpin.off
|
24
|
+
result <<= 1
|
25
|
+
adc_out.read
|
26
|
+
if adc_out.on?
|
27
|
+
result |= 0x1
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
cspin.on
|
32
|
+
|
33
|
+
result >> 1
|
34
|
+
end
|
35
|
+
|
36
|
+
clock = PiPiper::Pin.new :pin => 18, :direction => :out
|
37
|
+
adc_out = PiPiper::Pin.new :pin => 23
|
38
|
+
adc_in = PiPiper::Pin.new :pin => 24, :direction => :out
|
39
|
+
cs = PiPiper::Pin.new :pin => 25, :direction => :out
|
40
|
+
|
41
|
+
adc_pin = 0
|
42
|
+
|
43
|
+
loop do
|
44
|
+
value = read_adc(adc_pin, clock, adc_in, adc_out, cs)
|
45
|
+
invert = 1023 - value
|
46
|
+
mvolts = invert * (3300.0 / 1023.0)
|
47
|
+
if mvolts < 2700
|
48
|
+
temp = (mvolts - 380.0) / (2320.0 / 84.0)
|
49
|
+
else
|
50
|
+
temp = (mvolts - 2700.0) / (390.0 / 92.0) + 84.0
|
51
|
+
end
|
52
|
+
temp_f = (temp * 9.0 / 5.0) + 32
|
53
|
+
puts "Value = #{value}, invert = #{invert}, mvolts = #{mvolts}, temp = #{temp} C | #{temp_f} F"
|
54
|
+
sleep 1
|
55
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'pi_piper'
|
2
|
+
#special thanks to Jeremy Blythe, and his article @ http://jeremyblythe.blogspot.com/2012/09/raspberry-pi-hardware-spi-analog-inputs.html
|
3
|
+
#it greatly helped in getting the MCP3008 setup with SPI
|
4
|
+
|
5
|
+
adc_num = 0
|
6
|
+
|
7
|
+
loop do
|
8
|
+
value = 0
|
9
|
+
PiPiper::Spi.begin do |spi|
|
10
|
+
raw = spi.write [1, (8+adc_num)<<4, 0]
|
11
|
+
value = ((raw[1]&3) << 8) + raw[2]
|
12
|
+
end
|
13
|
+
|
14
|
+
invert = 1023 - value
|
15
|
+
mvolts = invert * (3300.0 / 1023.0)
|
16
|
+
if mvolts < 2700
|
17
|
+
temp = (mvolts - 380.0) / (2320.0 / 84.0)
|
18
|
+
else
|
19
|
+
temp = (mvolts - 2700.0) / (390.0 / 92.0) + 84.0
|
20
|
+
end
|
21
|
+
temp_f = (temp * 9.0 / 5.0) + 32
|
22
|
+
puts "Value = #{value}, invert = #{invert}, mvolts = #{mvolts}, temp = #{temp} C | #{temp_f} F"
|
23
|
+
sleep 1
|
24
|
+
end
|
Binary file
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'pi_piper'
|
2
|
+
|
3
|
+
unit = 0.1
|
4
|
+
dot = unit
|
5
|
+
dash = unit * 3
|
6
|
+
inter_element_gap = unit
|
7
|
+
short_gap = unit * 3
|
8
|
+
medium_gap = unit * 7
|
9
|
+
|
10
|
+
#http://en.wikipedia.org/wiki/Morse_code
|
11
|
+
character_timing = { "a" => [dot, dash], "b" => [dash, dot, dot, dot], "c" => [dash, dot, dash, dot],
|
12
|
+
"d" => [dash, dot, dot], "e" => [dot], "f" => [dot, dot, dash, dot],
|
13
|
+
"g" => [dash, dash, dot], "h" => [dot, dot, dot, dot], "i" => [dot, dot],
|
14
|
+
"j" => [dot, dash, dash, dash], "k" => [dash, dot, dash], "l" => [dot, dash, dot, dot],
|
15
|
+
"m" => [dash, dash], "n" => [dash, dot], "o" => [dash, dash, dash],
|
16
|
+
"p" => [dot, dash, dash, dot], "q" => [dash, dash, dot, dash], "r" => [dot, dash, dot],
|
17
|
+
"s" => [dot, dot, dot], "t" => [dash], "u" => [dot, dot, dash],
|
18
|
+
"v" => [dot, dot, dot, dash], "w" => [dot, dash, dash], "x" => [dash, dot, dot, dash],
|
19
|
+
"y" => [dash, dot, dash, dash], "z" => [dash, dash, dot, dot]}
|
20
|
+
|
21
|
+
pin = PiPiper::Pin.new(:pin => 17, :direction => :out)
|
22
|
+
pin.off
|
23
|
+
|
24
|
+
loop do
|
25
|
+
puts "Please type something"
|
26
|
+
something = gets.chomp.downcase
|
27
|
+
|
28
|
+
something.each_char do |letter|
|
29
|
+
if letter == " "
|
30
|
+
pin.off
|
31
|
+
sleep medium_gap
|
32
|
+
else
|
33
|
+
character_timing[letter].each do |timing|
|
34
|
+
pin.on
|
35
|
+
sleep timing
|
36
|
+
pin.off
|
37
|
+
sleep inter_element_gap
|
38
|
+
end
|
39
|
+
sleep short_gap - inter_element_gap
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|