smalruby 0.0.29 → 0.0.30

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of smalruby might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f93f4a1ce8fa065dd4261a0f299d8f73f2793ef1
4
- data.tar.gz: 1ea3cb55ce68a5228d9f487d881f18f4aec3d873
3
+ metadata.gz: 7ed757d4f688a45d5484eb73d54ab07c713d7280
4
+ data.tar.gz: 9d326347f27a65ddbe65b48c737ecc8a70a3f9d9
5
5
  SHA512:
6
- metadata.gz: a89b5b8d89dd4600ccf739d401dd2834b4e2938a89cda043e1fef32201e6e3613f9e8dd2a05aa603b36f10cd8f49e0115a769f4c9cd5cad61a3962b0f49adf79
7
- data.tar.gz: 676bb4833c0f49f0a7dc401a573198175c28b3d3b6523b96fa86c7310b218b9c6a157836e58ade2651dc5c6ab8804c40efa2fbf03be3952a73cb800c319a67f2
6
+ metadata.gz: f1e3c8ea41c6cfc46eeae5a44640f584fbdfa389dc5049cb00bca779d3b76985e3cc3ab0ba9d83f4b9cf258e48f2fd6421c75da02ef60dad3f9782713f771084
7
+ data.tar.gz: a9e997fe319235b23b037283ab48431c05551cb89a0260a41ec0cfbb0b0b9d39e6af70b3a917003df4b08f06b69c4db913deef64cd905e4d89a6905bad62f82c
@@ -391,6 +391,11 @@ module Smalruby
391
391
  Hardware.create_hardware(Hardware::TwoWheelDriveCar, pin)
392
392
  end
393
393
 
394
+ # モータードライバ
395
+ def motor_driver(pin)
396
+ Hardware.create_hardware(Hardware::MotorDriver, pin)
397
+ end
398
+
394
399
  # ボタン
395
400
  def button(pin)
396
401
  Hardware.create_hardware(Hardware::Button, pin)
@@ -534,6 +539,7 @@ module Smalruby
534
539
  private
535
540
 
536
541
  def draw_pen(left, top, right, bottom)
542
+ return if !visible || vanished?
537
543
  world.current_stage.line(left: left, top: top,
538
544
  right: right, bottom: bottom,
539
545
  color: @pen_color)
@@ -6,17 +6,29 @@ module Smalruby
6
6
  # ボタンを表現するクラス
7
7
  class Button < Dino::Components::Button
8
8
  def initialize(options)
9
- super(board: world.board, pin: Pin.smalruby_to_dino(options[:pin]))
9
+ @using_pullup = true
10
+ super(board: world.board, pin: Pin.smalruby_to_dino(options[:pin]),
11
+ pullup: true)
12
+ end
13
+
14
+ # プルアップ抵抗を使わない
15
+ def not_use_pullup
16
+ @using_pullup = false
17
+ board.set_pullup(pin, false)
18
+ end
19
+
20
+ def stop
21
+ @board.remove_digital_hardware(self)
10
22
  end
11
23
 
12
24
  def up?
13
- @state == UP
25
+ @using_pullup ? @state == DOWN : @state == UP
14
26
  end
15
27
 
16
28
  alias_method :on?, :up?
17
29
 
18
30
  def down?
19
- @state == DOWN
31
+ !up?
20
32
  end
21
33
 
22
34
  alias_method :off?, :down?
@@ -27,8 +39,8 @@ module Smalruby
27
39
  super(options)
28
40
 
29
41
  s_pin = Pin.dino_to_smalruby(pin)
30
- down { world.button_changed(s_pin, :down) }
31
- up { world.button_changed(s_pin, :up) }
42
+ down { world.button_changed(s_pin, (@using_pullup ? :up : :down)) }
43
+ up { world.button_changed(s_pin, (@using_pullup ? :down : :up)) }
32
44
  end
33
45
  end
34
46
  end
@@ -7,16 +7,43 @@ if Util.windows?
7
7
  require 'dino'
8
8
 
9
9
  if Dino::VERSION >= '0.11'
10
+ require 'mutex_m'
11
+
10
12
  class Dino::TxRx::Base
13
+ def write(message)
14
+ loop do
15
+ if IO.select(nil, [io], nil)
16
+ io.synchronize { io.syswrite(message) }
17
+ break
18
+ end
19
+ end
20
+ end
21
+
11
22
  def gets(timeout = 0.005)
12
- return nil unless IO.select([io], nil, nil, timeout)
13
- io.read_timeout = (timeout * 1000).to_i
14
- bytes = []
15
- until (x = io.getbyte).nil?
16
- bytes.push(x)
23
+ @buffer ||= ""
24
+ if !@buffer.include?("\n")
25
+ return nil unless IO.select([io], nil, nil, timeout)
26
+ io.synchronize do
27
+ io.read_timeout = (timeout * 1000).to_i
28
+ end
29
+ bytes = []
30
+ until (x = io.synchronize { io.getbyte }).nil?
31
+ bytes.push(x)
32
+ end
33
+ return nil if bytes.empty?
34
+ @buffer += bytes.pack("C*")
17
35
  end
18
- return nil if bytes.empty?
19
- bytes.pack("C*")
36
+ @buffer.slice!(/\A[^\n]*\n/)
37
+ end
38
+ end
39
+
40
+ class Dino::TxRx::Serial
41
+ def io
42
+ unless @io
43
+ @io = connect
44
+ @io.extend(Mutex_m)
45
+ end
46
+ @io
20
47
  end
21
48
  end
22
49
  elsif Dino::VERSION >= '0.10'
@@ -0,0 +1,77 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'smalruby/hardware'
3
+
4
+ module Smalruby
5
+ module Hardware
6
+ # モータードライバを表現するクラス
7
+ #
8
+ # モータードライバのVrefにはPWM出力できるD3, D5, D6, D9, D10, D11の
9
+ # いずれかを接続し、Vin1、Vin2はVrefからの連番(例えば、VrefがD3であ
10
+ # ればVin1、Vin2はそれぞれD4, D5)を接続してください。
11
+ #
12
+ # 動作確認済みのモータードライバの一覧
13
+ # * TOSHIBA
14
+ # * TA7291P
15
+ class MotorDriver < Dino::Components::BaseComponent
16
+ # モーターの回転速度の割合(0~100%)
17
+ attr_reader :speed
18
+
19
+ def initialize(options)
20
+ pin = Pin.smalruby_to_dino(options[:pin])
21
+ case pin
22
+ when 3, 5, 6, 9, 10, 11
23
+ super(board: world.board, pin: (pin...(pin + 3)).to_a)
24
+ else
25
+ fail "モーターのピン番号が間違っています: {options[:pin]}"
26
+ end
27
+ self.speed = options[:speed] || 100
28
+ end
29
+
30
+ def speed=(val)
31
+ @speed = val
32
+ if @speed < 0
33
+ @speed = 0
34
+ elsif @speed > 100
35
+ @speed = 100
36
+ end
37
+ end
38
+
39
+ # 正転する
40
+ def forward
41
+ write_pins(speed, 100, 0)
42
+ end
43
+
44
+ # 逆転する
45
+ def backward
46
+ write_pins(speed, 0, 100)
47
+ end
48
+
49
+ # 停止する
50
+ def stop
51
+ write_pins(0, 0, 0)
52
+ end
53
+
54
+ private
55
+
56
+ def after_initialize(_ = {})
57
+ pins.each do |pin|
58
+ set_pin_mode(pin, :out)
59
+ end
60
+ stop
61
+ end
62
+
63
+ def write_pins(*levels)
64
+ levels.each.with_index do |level, i|
65
+ case level
66
+ when 0
67
+ digital_write(pins[i], Dino::Board::LOW)
68
+ when 100
69
+ digital_write(pins[i], Dino::Board::HIGH)
70
+ else
71
+ analog_write(pins[i], (Dino::Board::HIGH * level / 100.0).round)
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
@@ -5,35 +5,58 @@ module Smalruby
5
5
  module Hardware
6
6
  # 2WD車のモーターを表現するクラス
7
7
  class TwoWheelDriveCar < Dino::Components::BaseComponent
8
+ # 左のモーターの速度%
9
+ attr_reader :left_speed
10
+
11
+ # 右のモーターの速度%
12
+ attr_reader :right_speed
13
+
8
14
  def initialize(options)
15
+ @left_speed = 100
16
+ @right_speed = 100
17
+
9
18
  pin = Pin.smalruby_to_dino(options[:pin])
10
19
  case pin
11
- when 2..10
20
+ when 5
21
+ super(board: world.board, pin: [5, 6, 9, 10])
22
+ when 6
12
23
  super(board: world.board, pin: (pin...(pin + 4)).to_a)
13
24
  else
14
25
  fail "モーターのピン番号が間違っています: {options[:pin]}"
15
26
  end
16
27
  end
17
28
 
29
+ [:left, :right].each do |lor|
30
+ define_method("#{lor}_speed=") do |val|
31
+ name = "@#{lor}_speed"
32
+ if val < 0
33
+ instance_variable_set(name, 0)
34
+ elsif val > 100
35
+ instance_variable_set(name, 100)
36
+ else
37
+ instance_variable_set(name, val)
38
+ end
39
+ end
40
+ end
41
+
18
42
  # 前進する
19
- def forward(left_level = 100,
20
- right_level = 100)
21
- digital_write_pins(left_level, 0, right_level, 0)
43
+ def forward
44
+ digital_write_pins(left_speed, 0, right_speed, 0)
22
45
  end
23
46
 
24
47
  # 後退する
25
- def backward(left_level = 100, right_level = 100)
26
- digital_write_pins(0, left_level, 0, right_level)
48
+ def backward
49
+ digital_write_pins(0, left_speed, 0, right_speed)
27
50
  end
28
51
 
29
52
  # 左に曲がる
30
- def turn_left(left_level = 100, right_level = 100)
31
- digital_write_pins(0, left_level, right_level, 0)
53
+ def turn_left
54
+ digital_write_pins(0, left_speed, right_speed, 0)
32
55
  end
33
56
 
34
57
  # 右に曲がる
35
- def turn_right(left_level = 100, right_level = 100)
36
- digital_write_pins(left_level, 0, 0, right_level)
58
+ def turn_right
59
+ digital_write_pins(left_speed, 0, 0, right_speed)
37
60
  end
38
61
 
39
62
  # 停止する
@@ -46,12 +69,10 @@ module Smalruby
46
69
  defaults = {
47
70
  command: 'forward',
48
71
  sec: nil,
49
- left_level: 100,
50
- right_level: 100,
51
72
  }
52
73
  opts = Util.process_options(options, defaults)
53
74
 
54
- send(opts[:command], opts[:left_level], opts[:right_level])
75
+ send(opts[:command])
55
76
  sleep(opts[:sec]) if opts[:sec]
56
77
  stop unless opts[:command] == :stop
57
78
  end
@@ -65,12 +86,26 @@ module Smalruby
65
86
  stop
66
87
  end
67
88
 
68
- def digital_write_pins(*levels)
69
- 2.times do
70
- levels.each.with_index do
71
- |level, i|
72
- digital_write(pins[i], (Dino::Board::HIGH * level / 100.0).to_i)
73
- sleep(0.05) if i.odd?
89
+ def digital_write_pins(*speeds)
90
+ if pins.first == 5
91
+ speeds.each.with_index do |speed, i|
92
+ level = (Dino::Board::HIGH * speed / 100.0).floor
93
+ case level
94
+ when 0
95
+ digital_write(pins[i], Dino::Board::LOW)
96
+ when 100
97
+ digital_write(pins[i], Dino::Board::HIGH)
98
+ else
99
+ analog_write(pins[i], level)
100
+ end
101
+ end
102
+ else
103
+ 2.times do
104
+ speeds.each.with_index do
105
+ |speed, i|
106
+ digital_write(pins[i], (Dino::Board::HIGH * speed / 100.0).floor)
107
+ sleep(0.05) if i.odd?
108
+ end
74
109
  end
75
110
  end
76
111
  end
@@ -16,6 +16,7 @@ module Smalruby
16
16
  autoload :RgbLedCathode
17
17
  autoload :Servo
18
18
  autoload :TwoWheelDriveCar
19
+ autoload :MotorDriver
19
20
 
20
21
  autoload :Button
21
22
  autoload :Sensor
@@ -1,5 +1,5 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
3
  module Smalruby
4
- VERSION = '0.0.29'
4
+ VERSION = '0.0.30'
5
5
  end
@@ -16,6 +16,8 @@ frog1 = Character.new(costume: 'frog1.png', x: 300, y: 200, visible: false)
16
16
  stage1.on(:start) do
17
17
  draw_font(string: DESCRIPTION, color: 'black')
18
18
 
19
+ button('D3').not_use_pullup
20
+
19
21
  if button('D3').up?
20
22
  frog1.visible = false
21
23
  else
@@ -0,0 +1,32 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ DESCRIPTION = <<EOS
4
+ ハードウェアのボタン(プルアップ)を操作します
5
+ EOS
6
+
7
+ # デジタルの3番ピンに直接ボタンを接続してください。
8
+
9
+ require 'smalruby'
10
+
11
+ init_hardware
12
+
13
+ stage1 = Stage.new(color: 'white')
14
+ frog1 = Character.new(costume: 'frog1.png', x: 300, y: 200, visible: false)
15
+
16
+ stage1.on(:start) do
17
+ draw_font(string: DESCRIPTION, color: 'black')
18
+
19
+ if button('D3').up?
20
+ frog1.visible = false
21
+ else
22
+ frog1.visible = true
23
+ end
24
+ end
25
+
26
+ stage1.on(:button_down, 'D3') do
27
+ frog1.visible = true
28
+ end
29
+
30
+ stage1.on(:button_up, 'D3') do
31
+ frog1.visible = false
32
+ end
@@ -0,0 +1,110 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ DESCRIPTION = <<EOS
4
+ モータードライバ(TA7291P)を操作します
5
+ EOS
6
+
7
+ # デジタルの6~11番ピンをそれぞれ左右のモーター用のモータードライバ
8
+ # (TA7291P)の4・5・6に接続してください。
9
+
10
+ require 'smalruby'
11
+
12
+ init_hardware
13
+
14
+ stage1 = Stage.new(color: 'white')
15
+
16
+ stage1.on(:start) do
17
+ fill(color: 'white')
18
+ draw_font(string: DESCRIPTION, color: 'black')
19
+
20
+ motor_driver('D6').speed = 100
21
+ motor_driver('D9').speed = 100
22
+ end
23
+
24
+ stage1.on(:key_down, K_UP) do
25
+ fill(color: 'white')
26
+ draw_font(string: '進む', color: 'black')
27
+
28
+ motor_driver('D6').forward
29
+ motor_driver('D9').forward
30
+
31
+ await until !Input.key_down?(K_UP)
32
+
33
+ fill(color: 'white')
34
+
35
+ motor_driver('D6').stop
36
+ motor_driver('D9').stop
37
+ end
38
+
39
+ stage1.on(:key_down, K_DOWN) do
40
+ fill(color: 'white')
41
+ draw_font(string: 'バックする', color: 'black')
42
+
43
+ motor_driver('D6').backward
44
+ motor_driver('D9').backward
45
+
46
+ await until !Input.key_down?(K_DOWN)
47
+
48
+ fill(color: 'white')
49
+
50
+ motor_driver('D6').stop
51
+ motor_driver('D9').stop
52
+ end
53
+
54
+ stage1.on(:key_down, K_LEFT) do
55
+ fill(color: 'white')
56
+ draw_font(string: '左に旋回する', color: 'black')
57
+
58
+ motor_driver('D6').backward
59
+ motor_driver('D9').forward
60
+
61
+ await until !Input.key_down?(K_LEFT)
62
+
63
+ fill(color: 'white')
64
+
65
+ motor_driver('D6').stop
66
+ motor_driver('D9').stop
67
+ end
68
+
69
+ stage1.on(:key_down, K_RIGHT) do
70
+ fill(color: 'white')
71
+ draw_font(string: '右に旋回する', color: 'black')
72
+
73
+ motor_driver('D6').forward
74
+ motor_driver('D9').backward
75
+
76
+ await until !Input.key_down?(K_RIGHT)
77
+
78
+ fill(color: 'white')
79
+
80
+ motor_driver('D6').stop
81
+ motor_driver('D9').stop
82
+ end
83
+
84
+ stage1.on(:key_push, K_W) do
85
+ motor_driver('D6').speed += 10
86
+
87
+ fill(color: 'white')
88
+ draw_font(string: "左の速度: #{motor_driver('D6').speed}%", color: 'black')
89
+ end
90
+
91
+ stage1.on(:key_push, K_S) do
92
+ motor_driver('D6').speed -= 10
93
+
94
+ fill(color: 'white')
95
+ draw_font(string: "左の速度: #{motor_driver('D6').speed}%", color: 'black')
96
+ end
97
+
98
+ stage1.on(:key_push, K_O) do
99
+ motor_driver('D9').speed += 10
100
+
101
+ fill(color: 'white')
102
+ draw_font(string: "右の速度: #{motor_driver('D9').speed}%", color: 'black')
103
+ end
104
+
105
+ stage1.on(:key_push, K_L) do
106
+ motor_driver('D9').speed -= 10
107
+
108
+ fill(color: 'white')
109
+ draw_font(string: "右の速度: #{motor_driver('D9').speed}%", color: 'black')
110
+ end
@@ -4,8 +4,8 @@ DESCRIPTION = <<EOS
4
4
  2WD車のタイヤ(モーター)を操作します
5
5
  EOS
6
6
 
7
- # デジタルの2番・3番ピンに左のモーター、4番・5番ピンに右のモーターを接
8
- # 続してください。
7
+ # PWM出力可能なデジタルの5番・6番ピンに左のモーター、10番・9番ピンに右
8
+ # のモーターを接続してください。
9
9
 
10
10
  require 'smalruby'
11
11
 
@@ -17,15 +17,43 @@ stage1.on(:start) do
17
17
  draw_font(string: DESCRIPTION, color: 'black')
18
18
 
19
19
  loop do
20
- two_wheel_drive_car('D6').forward
21
- sleep(3)
22
- two_wheel_drive_car('D6').backward
23
- sleep(3)
24
- two_wheel_drive_car('D6').turn_left
25
- sleep(3)
26
- two_wheel_drive_car('D6').turn_right
27
- sleep(3)
28
- two_wheel_drive_car('D6').stop
29
- sleep(3)
20
+ two_wheel_drive_car('D5').forward
21
+ sleep(2)
22
+ two_wheel_drive_car('D5').backward
23
+ sleep(2)
24
+ two_wheel_drive_car('D5').turn_left
25
+ sleep(0.5)
26
+ two_wheel_drive_car('D5').turn_right
27
+ sleep(0.5)
28
+ two_wheel_drive_car('D5').stop
29
+ sleep(1)
30
30
  end
31
31
  end
32
+
33
+ stage1.on(:key_push, K_E) do
34
+ two_wheel_drive_car('D5').left_speed += 1
35
+
36
+ fill(color: 'white')
37
+ draw_font(string: "速度%: 左< #{two_wheel_drive_car('D5').left_speed} > 右< #{two_wheel_drive_car('D5').right_speed} >", color: 'black')
38
+ end
39
+
40
+ stage1.on(:key_push, K_D) do
41
+ two_wheel_drive_car('D5').left_speed -= 1
42
+
43
+ fill(color: 'white')
44
+ draw_font(string: "速度%: 左< #{two_wheel_drive_car('D5').left_speed} > 右< #{two_wheel_drive_car('D5').right_speed} >", color: 'black')
45
+ end
46
+
47
+ stage1.on(:key_push, K_UP) do
48
+ two_wheel_drive_car('D5').right_speed += 1
49
+
50
+ fill(color: 'white')
51
+ draw_font(string: "速度%: 左< #{two_wheel_drive_car('D5').left_speed} > 右< #{two_wheel_drive_car('D5').right_speed} >", color: 'black')
52
+ end
53
+
54
+ stage1.on(:key_push, K_DOWN) do
55
+ two_wheel_drive_car('D5').right_speed -= 1
56
+
57
+ fill(color: 'white')
58
+ draw_font(string: "速度%: 左< #{two_wheel_drive_car('D5').left_speed} > 右< #{two_wheel_drive_car('D5').right_speed} >", color: 'black')
59
+ end
@@ -4,8 +4,8 @@ DESCRIPTION = <<EOS
4
4
  2WD車のタイヤ(モーター)を操作します
5
5
  EOS
6
6
 
7
- # デジタルの6番・7番ピンに左のモーター、8番・9番ピンに右のモーターを接
8
- # 続してください。
7
+ # PWM出力可能なデジタルの5番・6番ピンに左のモーター、10番・9番ピンに右
8
+ # のモーターを接続してください。
9
9
 
10
10
  require 'smalruby'
11
11
 
@@ -17,13 +17,10 @@ stage1.on(:start) do
17
17
  draw_font(string: DESCRIPTION, color: 'black')
18
18
 
19
19
  loop do
20
- two_wheel_drive_car('D6').run(command: 'forward', sec: 2, left_level: 85, right_level: 100)
21
- sleep(1)
22
- two_wheel_drive_car('D6').run(command: 'backward', sec: 2, left_level: 85, right_level: 100)
23
- sleep(1)
24
- two_wheel_drive_car('D6').run(command: 'turn_left', sec: 2, left_level: 85, right_level: 100)
25
- sleep(1)
26
- two_wheel_drive_car('D6').run(command: 'turn_right', sec: 2, left_level: 85, right_level: 100)
27
- sleep(1)
20
+ two_wheel_drive_car('D5').run(command: 'forward', sec: 2)
21
+ two_wheel_drive_car('D5').run(command: 'backward', sec: 2)
22
+ two_wheel_drive_car('D5').run(command: 'turn_left', sec: 2)
23
+ two_wheel_drive_car('D5').run(command: 'turn_right', sec: 2)
24
+ two_wheel_drive_car('D5').run(command: 'stop', sec: 2)
28
25
  end
29
26
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smalruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.29
4
+ version: 0.0.30
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kouji Takao
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-21 00:00:00.000000000 Z
11
+ date: 2014-08-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -259,6 +259,7 @@ files:
259
259
  - lib/smalruby/hardware/button.rb
260
260
  - lib/smalruby/hardware/dino/fix_gets.rb
261
261
  - lib/smalruby/hardware/led.rb
262
+ - lib/smalruby/hardware/motor_driver.rb
262
263
  - lib/smalruby/hardware/null_hardware.rb
263
264
  - lib/smalruby/hardware/pin.rb
264
265
  - lib/smalruby/hardware/rgb_led_anode.rb
@@ -281,7 +282,9 @@ files:
281
282
  - samples/extra_car.png
282
283
  - samples/finding_cars.rb
283
284
  - samples/hardware_button.rb
285
+ - samples/hardware_button_with_pullup.rb
284
286
  - samples/hardware_led.rb
287
+ - samples/hardware_motor_driver.rb
285
288
  - samples/hardware_rgb_led_anode.rb
286
289
  - samples/hardware_rgb_led_cathode.rb
287
290
  - samples/hardware_sensor.rb