rotor 0.1.00 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +92 -14
- data/lib/rotor/gcode.rb +94 -32
- data/lib/rotor/stepper.rb +23 -23
- data/lib/rotor/version.rb +1 -1
- data/visual.xlsx +0 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 62d8ac2a05984d3d5d1db744a7dec78f88003e98
|
4
|
+
data.tar.gz: 98c73074be6a11b631df7351c4add650bb05d447
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4c037e8f5cf5f319e20fcd8f317f0cf363617e187c09b7af23a3b564476d70017930ecc87e371a9d80a30237df5ec24d4dc540a5c266578d8a4ecff70d8ad0e1
|
7
|
+
data.tar.gz: bcf1702711ce5959aff917e5cf1562fc8cdc5ff262a2be2998325488bd06cbef1e43e2f2a2627af63977ae869788c833f83f67058f881d6324fabb36e82ca161
|
data/README.md
CHANGED
@@ -12,33 +12,62 @@ or ULN2800 Integrated Controllers.
|
|
12
12
|
|
13
13
|
gem install wiringpi
|
14
14
|
|
15
|
+
If you are using GPIO Pins from a A+/B+, you may need to update your
|
16
|
+
WiringPi libraries. You can pull from my repo https://github.com/kobaltz/WiringPi-Ruby
|
17
|
+
|
18
|
+
I did not write any of the WiringPi-Ruby platform. I simply pulled the latest C libraries
|
19
|
+
and recompiled the gem.
|
20
|
+
|
15
21
|
Install Rotor
|
16
22
|
|
17
23
|
gem install rotor
|
18
24
|
|
19
25
|
# Notes
|
20
26
|
|
21
|
-
|
27
|
+
This gem has been built for my personal project. I do not and cannot know if this will
|
28
|
+
work with your setup. However, put in an issue if you're having troubles with this gem
|
29
|
+
and I will try to help you as best as I can.
|
30
|
+
|
31
|
+
I am using two stepper motors (NEMA17 Bipolar 20Ncm 12V) and two L293D motor drivers. This
|
32
|
+
gem has also been tested with a small 5V Unipolar Stepper Motor and 12V Unipolar Stepper Motor.
|
33
|
+
|
34
|
+
My Steps Per MM is based on a 200 step per revolution motor and a threaded rod with 20 threads per inch.
|
35
|
+
This means that I will have to step 4000 times to move the coupler one inch.
|
36
|
+
|
37
|
+
# Usage
|
38
|
+
|
39
|
+
## Class Stepper
|
40
|
+
|
41
|
+
MAKE SURE THAT YOU HAVE CONFIGURED THE Rotor::Stepper WITH THE CORRECT GPIO PIN NUMBERS. CHECK AND
|
42
|
+
DOUBLE CHECK THESE BEFORE RUNNING YOUR CODE.
|
22
43
|
|
23
|
-
stepper = Rotor::Stepper.new(
|
24
|
-
stepper.forward(delay=5,steps=100)
|
44
|
+
stepper = Rotor::Stepper.new(coil_A_1_pin, coil_A_2_pin, coil_B_1_pin, coil_B_2_pin, enable_pin=nil, homing_switch, homing_normally,steps_per_mm)
|
45
|
+
stepper.forward(delay=5,steps=100) # stepper.forward(1,100)
|
25
46
|
stepper.backwards(delay=5,steps=100)
|
26
47
|
stepper.set_home(direction) #:forward or :backwards
|
27
48
|
stepper.at_home?
|
28
|
-
stepper.at_safe_area? #opposite of at_home?
|
49
|
+
stepper.at_safe_area? # opposite of at_home?
|
29
50
|
|
30
|
-
|
51
|
+
After running your GCode, you may want to consider to power down the motor by sending a
|
52
|
+
LOW to each step.
|
53
|
+
|
54
|
+
stepper.power_down
|
55
|
+
|
56
|
+
## Class Servo
|
31
57
|
|
32
58
|
servo = Rotor::Servo.new(pin=18)
|
33
59
|
servo.rotate(direction) # :up or :down
|
34
60
|
|
35
|
-
Class GCode
|
61
|
+
## Class GCode
|
36
62
|
|
37
|
-
|
38
|
-
gcode.open(file)
|
39
|
-
gcode.simulate
|
63
|
+
The plot points are streamed to output.txt file on your computer.
|
40
64
|
|
41
|
-
|
65
|
+
You can test the outputs of your GCODE and the XY plots it creates by Rotor.
|
66
|
+
|
67
|
+
File.open("output.txt", 'wb') { |file| file.write("x,y,xm,ym\n") }
|
68
|
+
gcode = Rotor::Gcode.new(nil,nil,nil,1,nil)
|
69
|
+
gcode.open('output.nc')
|
70
|
+
gcode.simulate
|
42
71
|
|
43
72
|
The goal of this gem is to make controlling your robotics easier than
|
44
73
|
other solutions.
|
@@ -49,8 +78,8 @@ or ULN2800 Integrated Controllers.
|
|
49
78
|
that the panel is moving in and therefore know which side it has hit. This
|
50
79
|
was to reduce the number of GPIO pins required.
|
51
80
|
|
52
|
-
stepper_x = Rotor::Stepper.new(23,12,17,24,nil,13,
|
53
|
-
stepper_y = Rotor::Stepper.new(25, 4,21,22,nil,19,
|
81
|
+
stepper_x = Rotor::Stepper.new(23,12,17,24,nil,13,0,157.48)
|
82
|
+
stepper_y = Rotor::Stepper.new(25, 4,21,22,nil,19,0,157.48)
|
54
83
|
|
55
84
|
You can use a servo to control the marker (or leave blank if you're using a Z Axis Stepper)
|
56
85
|
This will be built out so that the strength control of the servo (for laser power) can be
|
@@ -65,8 +94,8 @@ or ULN2800 Integrated Controllers.
|
|
65
94
|
# stepper_x.forward(1,100)
|
66
95
|
# stepper_y.set_home(:forward)
|
67
96
|
|
68
|
-
stepper_x = Rotor::Stepper.new(
|
69
|
-
stepper_y = Rotor::Stepper.new(25,
|
97
|
+
stepper_x = Rotor::Stepper.new(23,12,17,24,nil,13,LOW,157.48)
|
98
|
+
stepper_y = Rotor::Stepper.new(25, 4,21,22,nil,19,LOW,157.48)
|
70
99
|
|
71
100
|
loop do
|
72
101
|
puts "Enter steps forward::"
|
@@ -114,6 +143,55 @@ keep this at 1).
|
|
114
143
|
threads << Thread.new { stepper_y.forward(5,text.to_i) }
|
115
144
|
threads.each { |thr| thr.join }
|
116
145
|
|
146
|
+
# Sample Code
|
147
|
+
|
148
|
+
## Production (Moving Stepper and Servo)
|
149
|
+
|
150
|
+
Here is the real world sample code that I am using to plot
|
151
|
+
|
152
|
+
require 'rotor'
|
153
|
+
begin
|
154
|
+
stepper_x = Rotor::Stepper.new(23,12,17,24,nil,13,0,157.48)
|
155
|
+
stepper_y = Rotor::Stepper.new(25, 4,21,22,nil,19,0,157.48)
|
156
|
+
servo = Rotor::Servo.new(18)
|
157
|
+
|
158
|
+
stepper_x.set_home(:backwards)
|
159
|
+
stepper_y.set_home(:backwards)
|
160
|
+
stepper_x.forward(1,4000)
|
161
|
+
stepper_y.forward(1,4000)
|
162
|
+
|
163
|
+
gcode = Rotor::Gcode.new(stepper_x,stepper_y,nil,1,servo)
|
164
|
+
gcode.open('output.nc')
|
165
|
+
gcode.simulate
|
166
|
+
|
167
|
+
ensure
|
168
|
+
servo.rotate(:up)
|
169
|
+
|
170
|
+
stepper_x.set_home(:backwards)
|
171
|
+
stepper_y.set_home(:backwards)
|
172
|
+
stepper_x.forward(1,4000)
|
173
|
+
stepper_y.forward(1,4000)
|
174
|
+
|
175
|
+
stepper_x.power_down
|
176
|
+
stepper_y.power_down
|
177
|
+
|
178
|
+
[23,12,17,24,13,25,4,21,22,19,13].each do |pin|
|
179
|
+
`echo #{pin} > /sys/class/gpio/unexport`
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
## Development (Exporting Plot Points for Graphing)
|
184
|
+
|
185
|
+
Before wasting more materials, I try to plot my points to a file and view them in Excel.
|
186
|
+
Within the root of this repository, there is an Excel file, called Visual.xlsx, and
|
187
|
+
you can import the output.txt into the first four columns. By doing so, you can see the
|
188
|
+
plot points and the scatter of movements.
|
189
|
+
|
190
|
+
File.open("output.txt", 'wb') { |file| file.write("x,y,xm,ym\n") }
|
191
|
+
gcode = Rotor::Gcode.new(nil,nil,nil,1,nil)
|
192
|
+
gcode.open('output.nc')
|
193
|
+
gcode.simulate
|
194
|
+
|
117
195
|
# License
|
118
196
|
|
119
197
|
Copyright (c) 2015 kobaltz
|
data/lib/rotor/gcode.rb
CHANGED
@@ -17,8 +17,17 @@ module Rotor
|
|
17
17
|
@y = 0
|
18
18
|
@z = 0
|
19
19
|
|
20
|
+
line_num = 0
|
21
|
+
last_parsed_line = nil
|
22
|
+
|
20
23
|
@file.each_line do |line|
|
24
|
+
puts "last_parsed_line::#{last_parsed_line}"
|
25
|
+
line = line.gsub("J-0.000000","J-0.000001") if last_parsed_line && last_parsed_line[:j] && last_parsed_line[:j] > 0.0
|
26
|
+
line = line.gsub("J-0.000000","J0.000001") if last_parsed_line && last_parsed_line[:j] && last_parsed_line[:j] < 0.0
|
27
|
+
|
21
28
|
parsed_line = parse_line(line)
|
29
|
+
|
30
|
+
line_num += 1
|
22
31
|
if parsed_line[:g]
|
23
32
|
#Move to this origin point.
|
24
33
|
if parsed_line[:g] == 0
|
@@ -39,13 +48,15 @@ module Rotor
|
|
39
48
|
elsif parsed_line[:z] && parsed_line[:f].nil? && parsed_line[:x].nil? && parsed_line[:y].nil?
|
40
49
|
puts "Raising marker::#{parsed_line}"
|
41
50
|
@servo.rotate(:up) if @servo
|
51
|
+
elsif parsed_line[:z].nil? && parsed_line[:f] && parsed_line[:x].nil? && parsed_line[:y].nil?
|
52
|
+
# Set feed/spin rate
|
42
53
|
else
|
43
54
|
puts "Move Stepper::#{parsed_line}"
|
44
|
-
move_stepper(parsed_line,
|
55
|
+
move_stepper(parsed_line,10)
|
45
56
|
end
|
46
57
|
elsif parsed_line[:g] == 2 || parsed_line[:g] == 3
|
47
58
|
# Get my ARC on
|
48
|
-
puts "DEBUG::#{parsed_line}"
|
59
|
+
# puts "DEBUG::#{parsed_line}"
|
49
60
|
x_start = @x
|
50
61
|
x_end = parsed_line[:x]
|
51
62
|
|
@@ -53,7 +64,11 @@ module Rotor
|
|
53
64
|
y_end = parsed_line[:y]
|
54
65
|
|
55
66
|
x_offset = parsed_line[:i]
|
67
|
+
x_offset = 0.0001 if x_offset == 0.0
|
68
|
+
x_offset = -0.0001 if x_offset == -0.0
|
56
69
|
y_offset = parsed_line[:j]
|
70
|
+
y_offset = 0.0001 if y_offset == 0.0
|
71
|
+
y_offset = -0.0001 if y_offset == -0.0
|
57
72
|
|
58
73
|
x_origin = x_offset + x_start
|
59
74
|
y_origin = y_offset + y_start
|
@@ -63,23 +78,28 @@ module Rotor
|
|
63
78
|
start_angle = Math.atan2((y_start - y_origin),(x_start - x_origin))
|
64
79
|
end_angle = Math.atan2((y_end - y_origin),(x_end - x_origin))
|
65
80
|
|
66
|
-
|
81
|
+
number_of_precision = 5
|
82
|
+
|
83
|
+
steps = (end_angle - start_angle) / number_of_precision
|
67
84
|
|
68
85
|
current_degrees = start_angle
|
69
86
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
87
|
+
number_of_precision.times do |i|
|
88
|
+
# unless i == (number_of_precision - 1)
|
89
|
+
current_degrees += steps
|
90
|
+
arc_line = {}
|
91
|
+
arc_line[:g] = parsed_line[:g]
|
92
|
+
arc_line[:x] = radius * Math.cos(current_degrees) + x_origin
|
93
|
+
arc_line[:y] = radius * Math.sin(current_degrees) + y_origin
|
94
|
+
arc_line[:z] = nil
|
95
|
+
puts "Move Arc Stepper (#{line_num})::#{arc_line},#{current_degrees}::#{y_offset}"
|
96
|
+
move_stepper(arc_line,10)
|
97
|
+
# end
|
78
98
|
end
|
79
99
|
|
80
|
-
|
81
100
|
else
|
82
101
|
# puts "GLINE - Something else"
|
102
|
+
puts "DEBUG::GLINE - Something else::#{parsed_line}"
|
83
103
|
end
|
84
104
|
elsif parsed_line[:m]
|
85
105
|
if line[0..2] == "M03"
|
@@ -90,10 +110,13 @@ module Rotor
|
|
90
110
|
@servo.rotate(:up) if @servo
|
91
111
|
else
|
92
112
|
# puts "MLINE - Something else"
|
113
|
+
puts "DEBUG::MLINE - Something else::#{parsed_line}"
|
93
114
|
end
|
94
115
|
else
|
95
116
|
# puts "Something else"
|
117
|
+
puts "DEBUG::????? - Something else::#{parsed_line}"
|
96
118
|
end
|
119
|
+
last_parsed_line = parsed_line
|
97
120
|
end
|
98
121
|
end
|
99
122
|
|
@@ -101,31 +124,68 @@ module Rotor
|
|
101
124
|
|
102
125
|
def move_stepper(parsed_line,delay)
|
103
126
|
threads = []
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
if instance_variable_get(:"@stepper_#{ets}") && instance_variable_get(:"@stepper_#{ets}").at_safe_area?
|
120
|
-
threads << Thread.new { instance_variable_get(:"@stepper_#{ets}").backwards(delay, instance_variable_get(:"@#{ets}_movement")) }
|
121
|
-
end
|
127
|
+
@x_move = nil
|
128
|
+
if parsed_line[:x]
|
129
|
+
@x_move = parsed_line[:x]
|
130
|
+
@x_move ||= 0
|
131
|
+
@x_move *= @scale
|
132
|
+
|
133
|
+
@x_movement = (@x_move - @x).abs
|
134
|
+
|
135
|
+
if @x_move.to_f > @x #move to the right
|
136
|
+
if @stepper_x # && @stepper_x.at_safe_area?
|
137
|
+
threads << Thread.new { @stepper_x.forward(delay, @x_movement) }
|
138
|
+
end
|
139
|
+
elsif @x_move.to_f < @x #move to the left
|
140
|
+
if @stepper_x # && @stepper_x.at_safe_area?
|
141
|
+
threads << Thread.new { @stepper_x.backwards(delay, @x_movement) }
|
122
142
|
end
|
123
|
-
instance_variable_set(:"@#{ets}",instance_variable_get(:"@#{ets}_move"))
|
124
143
|
end
|
144
|
+
@x = @x_move
|
125
145
|
end
|
126
146
|
|
127
|
-
|
147
|
+
@y_move = nil
|
148
|
+
if parsed_line[:y]
|
149
|
+
@y_move = parsed_line[:y]
|
150
|
+
@y_move ||= 0
|
151
|
+
@y_move *= @scale
|
152
|
+
|
153
|
+
@y_movement = (@y_move - @y).abs
|
154
|
+
|
155
|
+
if @y_move.to_f > @y #move to the right
|
156
|
+
if @stepper_y # && @stepper_y.at_safe_area?
|
157
|
+
threads << Thread.new { @stepper_y.forward(delay, @y_movement) }
|
158
|
+
end
|
159
|
+
elsif @y_move.to_f < @y #move to the left
|
160
|
+
if @stepper_y # && @stepper_y.at_safe_area?
|
161
|
+
threads << Thread.new { @stepper_y.backwards(delay, @y_movement) }
|
162
|
+
end
|
163
|
+
end
|
164
|
+
@y = @y_move
|
165
|
+
end
|
166
|
+
|
167
|
+
@z_move = nil
|
168
|
+
if parsed_line[:z]
|
169
|
+
@z_move = parsed_line[:z]
|
170
|
+
@z_move ||= 0
|
171
|
+
@z_move *= @scale
|
172
|
+
|
173
|
+
@z_movement = (@z_move - @z).abs
|
174
|
+
|
175
|
+
if @z_move.to_f > @z #move to the right
|
176
|
+
if @stepper_z # && @stepper_z.at_safe_area?
|
177
|
+
threads << Thread.new { @stepper_z.forward(delay, @z_movement) }
|
178
|
+
end
|
179
|
+
elsif @z_move.to_f < @z #move to the left
|
180
|
+
if @stepper_z # && @stepper_z.at_safe_area?
|
181
|
+
threads << Thread.new { @stepper_z.backwards(delay, @z_movement) }
|
182
|
+
end
|
183
|
+
end
|
184
|
+
@z = @z_move
|
185
|
+
end
|
186
|
+
# puts "Moving to G#{parsed_line[:g]} #{@x_move}(#{@x_movement}), #{@y_move}(#{@y_movement}), #{@z_move}(#{@z_movement})"
|
128
187
|
threads.each { |thr| thr.join }
|
188
|
+
File.open("output.txt", 'a') { |file| file.write("#{@x_move},#{@y_move},#{@x_movement},#{@y_movement}\n") } if File.exists?("output.txt")
|
129
189
|
end
|
130
190
|
|
131
191
|
def parse_line(line)
|
@@ -142,6 +202,8 @@ module Rotor
|
|
142
202
|
data = line.match /#{node}(?<data>\d+[,.]\d+)/
|
143
203
|
data ||= line.match /#{node}(?<data>\d+)/
|
144
204
|
data ||= line.match /#{node}(?<data>-\d+[,.]\d+)/
|
205
|
+
data ||= line.match /#{node}(?<data>\d+[,.])/
|
206
|
+
data ||= line.match /#{node}(?<data>-\d+[,.])/
|
145
207
|
if data
|
146
208
|
case element
|
147
209
|
when :g, :m
|
data/lib/rotor/stepper.rb
CHANGED
@@ -2,17 +2,20 @@ require 'wiringpi'
|
|
2
2
|
|
3
3
|
module Rotor
|
4
4
|
class Stepper
|
5
|
-
def initialize(coil_A_1_pin, coil_A_2_pin, coil_B_1_pin, coil_B_2_pin, enable_pin=nil, homing_switch, homing_normally)
|
5
|
+
def initialize(coil_A_1_pin, coil_A_2_pin, coil_B_1_pin, coil_B_2_pin, enable_pin=nil, homing_switch, homing_normally,steps_per_mm)
|
6
6
|
@io = WiringPi::GPIO.new(WPI_MODE_GPIO)
|
7
7
|
@coil_A_1_pin = coil_A_1_pin
|
8
8
|
@coil_A_2_pin = coil_A_2_pin
|
9
9
|
@coil_B_1_pin = coil_B_1_pin
|
10
10
|
@coil_B_2_pin = coil_B_2_pin
|
11
11
|
@enable_pin = enable_pin
|
12
|
-
|
12
|
+
@steps_per_mm = steps_per_mm
|
13
13
|
@homing_switch = homing_switch
|
14
14
|
@homing_normally = homing_normally
|
15
15
|
|
16
|
+
@step = 0
|
17
|
+
@ps = [[1,0,1,0],[0,1,1,0],[0,1,0,1],[1,0,0,1]]
|
18
|
+
|
16
19
|
[@coil_A_1_pin, @coil_A_2_pin, @coil_B_1_pin, @coil_B_2_pin].each do |pin|
|
17
20
|
`echo #{pin} > /sys/class/gpio/unexport`
|
18
21
|
@io.mode(pin,OUTPUT)
|
@@ -34,39 +37,32 @@ module Rotor
|
|
34
37
|
|
35
38
|
def forward(delay=5,steps=100)
|
36
39
|
delay_time = delay/1000.0
|
37
|
-
(0..steps).each do |i|
|
38
|
-
set_step(
|
39
|
-
|
40
|
-
|
41
|
-
sleep delay_time
|
42
|
-
set_step(0, 1, 0, 1)
|
43
|
-
sleep delay_time
|
44
|
-
set_step(1, 0, 0, 1)
|
40
|
+
(0..(steps * @steps_per_mm)).each do |i|
|
41
|
+
set_step(@ps[@step][0],@ps[@step][1],@ps[@step][2],@ps[@step][3])
|
42
|
+
@step += 1
|
43
|
+
@step = 0 if @step == 4
|
45
44
|
sleep delay_time
|
46
45
|
end
|
47
46
|
end
|
48
47
|
|
48
|
+
|
49
49
|
def backwards(delay=5,steps=100)
|
50
50
|
delay_time = delay/1000.0
|
51
|
-
(0..steps).each do |i|
|
52
|
-
set_step(
|
53
|
-
|
54
|
-
|
55
|
-
sleep delay_time
|
56
|
-
set_step(0, 1, 1, 0)
|
57
|
-
sleep delay_time
|
58
|
-
set_step(1, 0, 1, 0)
|
51
|
+
(0..(steps * @steps_per_mm)).each do |i|
|
52
|
+
set_step(@ps[@step][0],@ps[@step][1],@ps[@step][2],@ps[@step][3])
|
53
|
+
@step -= 1
|
54
|
+
@step = 3 if @step == -1
|
59
55
|
sleep delay_time
|
60
56
|
end
|
61
|
-
|
62
|
-
|
57
|
+
|
58
|
+
end
|
63
59
|
|
64
60
|
def set_home(direction)
|
65
61
|
puts "Setting #{direction} with Homing on GPIO #{@homing_switch}"
|
66
62
|
@move = true
|
67
63
|
while @move == true
|
68
|
-
backwards(
|
69
|
-
forward(
|
64
|
+
backwards(1,1) if direction == :backwards #&& @io.read(@homing_switch) == @homing_normally
|
65
|
+
forward(1,1) if direction == :forward #&& @io.read(@homing_switch) == @homing_normally
|
70
66
|
@move = false unless @io.read(@homing_switch) == @homing_normally
|
71
67
|
end
|
72
68
|
end
|
@@ -87,6 +83,10 @@ module Rotor
|
|
87
83
|
end
|
88
84
|
end
|
89
85
|
|
86
|
+
def power_down
|
87
|
+
set_step(0, 0, 0, 0)
|
88
|
+
end
|
89
|
+
|
90
90
|
private
|
91
91
|
|
92
92
|
def set_step(w1, w2, w3, w4)
|
@@ -94,6 +94,6 @@ module Rotor
|
|
94
94
|
@io.write(@coil_A_2_pin, w2)
|
95
95
|
@io.write(@coil_B_1_pin, w3)
|
96
96
|
@io.write(@coil_B_2_pin, w4)
|
97
|
-
end
|
97
|
+
end
|
98
98
|
end
|
99
99
|
end
|
data/lib/rotor/version.rb
CHANGED
data/visual.xlsx
ADDED
Binary file
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rotor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- kobaltz
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-01-
|
11
|
+
date: 2015-01-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -74,6 +74,7 @@ files:
|
|
74
74
|
- lib/rotor/version.rb
|
75
75
|
- rotor.gemspec
|
76
76
|
- sample.nc
|
77
|
+
- visual.xlsx
|
77
78
|
homepage: https://github.com/kobaltz/rotor
|
78
79
|
licenses:
|
79
80
|
- MIT
|