farmbot-serial 0.0.1

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 07780e1523d04161c781211ba25173ffa6e51db0
4
+ data.tar.gz: f2677ab821c15c5664f099d7afd7e51805b2f2b2
5
+ SHA512:
6
+ metadata.gz: 34dffc021c50794f21635582f35c102f6199c9ee349bb53f496ec9b15655c702ba4f01725c713366b1cd4611b588fa47212bd7346418ad08aa85b25cdbd9cc09
7
+ data.tar.gz: 6f5bc299b55e95d3083c255d0f30d13f7b7db18b3a36740a61cc4d923f6f4e14f4f73fb367d1b6198293ebcc1660b845ffd96225e0480099240fa83a6ded11c6
@@ -0,0 +1,46 @@
1
+ *.gem
2
+ *.rbc
3
+ *.swp
4
+ .bundle/*
5
+ .DS_Store
6
+ .idea/*
7
+ .loadpath
8
+ .project
9
+ .ruby-gemset
10
+ .ruby-version
11
+ /.bundle
12
+ /.bundle/
13
+ /.yardoc/
14
+ /_yardoc/
15
+ /coverage/
16
+ /coverage/
17
+ /db/*.sqlite3
18
+ /db/*.sqlite3-journal
19
+ /doc/
20
+ /InstalledFiles
21
+ /lib/.build
22
+ /lib/bundler/man/
23
+ /log/*.log
24
+ /pkg/
25
+ /rdoc/
26
+ /spec/reports/
27
+ /test/tmp/
28
+ /test/version_tmp/
29
+ /tmp
30
+ /tmp/
31
+ config.yml
32
+ coverage/**
33
+ credentials.yml
34
+ doc/*
35
+ doc/**/*
36
+ Gemfile.lock
37
+ log/*
38
+ notes.rb
39
+ settings.rb
40
+ /lib/.build
41
+ write_db_settings.rb
42
+ snippet.coffee
43
+ snippets.rb
44
+ tmp/**/*
45
+ *.rb~
46
+ Gemfile.lock
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'rspec'
4
+ gem 'pry'
5
+ gem 'simplecov'
6
+ gem 'serialport'
@@ -0,0 +1 @@
1
+ Under construction.
@@ -0,0 +1,9 @@
1
+ require 'rake/testtask'
2
+
3
+ Rake::TestTask.new do |t|
4
+ t.libs << 'test'
5
+ t.test_files = Dir.glob('test/**/*_test.rb')
6
+ end
7
+
8
+ desc "Run tests"
9
+ task :default => :test
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "farmbot-serial"
7
+ spec.version = '0.0.1' # TODO: Fb::Serial::VERSION
8
+ spec.authors = ["Tim Evers", "Rick Carlino"]
9
+ spec.email = ["rick.carlino@gmail.com"]
10
+ spec.description = "Serial library for Farmbot"
11
+ spec.summary = "Serial library for Farmbot"
12
+ spec.homepage = "http://github.com/farmbot/farmbot-serial"
13
+ spec.license = "MIT"
14
+
15
+ spec.files = `git ls-files`.split($/)
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_development_dependency "bundler"#, "~> 1.3"
21
+ spec.add_development_dependency "rake"#, "~> 10.4"
22
+ spec.add_development_dependency "rspec"#, "~> 3.2"
23
+ spec.add_development_dependency "pry"#, "~> 0.10"
24
+ spec.add_development_dependency "simplecov"#, "~> 0.9"
25
+
26
+ spec.add_runtime_dependency "serialport"#, "~> 1.3"
27
+ end
@@ -0,0 +1,148 @@
1
+ # Put this in a module.
2
+ $arduino_default_params = [
3
+ {
4
+ :name => 'PARAM_VERSION',
5
+ :id => 0,
6
+ :value => 0
7
+ },
8
+ {
9
+ :name => 'MOVEMENT_TIMEOUT_X',
10
+ :id => 11,
11
+ :value => 15
12
+ },
13
+ {
14
+ :name => 'MOVEMENT_TIMEOUT_Y',
15
+ :id => 12,
16
+ :value => 15
17
+ },
18
+ {
19
+ :name => 'MOVEMENT_TIMEOUT_Z',
20
+ :id => 13,
21
+ :value => 15
22
+ },
23
+ {
24
+ :name => 'MOVEMENT_INVERT_ENDPOINTS_X',
25
+ :id => 21,
26
+ :value => 0
27
+ },
28
+ {
29
+ :name => 'MOVEMENT_INVERT_ENDPOINTS_Y',
30
+ :id => 22,
31
+ :value => 0
32
+ },
33
+ {
34
+ :name => 'MOVEMENT_INVERT_ENDPOINTS_Z',
35
+ :id => 23,
36
+ :value => 0
37
+ },
38
+ {
39
+ :name => 'MOVEMENT_INVERT_MOTOR_X',
40
+ :id => 31,
41
+ :value => 0
42
+ },
43
+ {
44
+ :name => 'MOVEMENT_INVERT_MOTOR_Y',
45
+ :id => 32,
46
+ :value => 0
47
+ },
48
+ {
49
+ :name => 'MOVEMENT_INVERT_MOTOR_Z',
50
+ :id => 33,
51
+ :value => 0
52
+ },
53
+ {
54
+ :name => 'MOVEMENT_STEPS_ACC_DEC_X',
55
+ :id => 41,
56
+ :value => 100
57
+ },
58
+ {
59
+ :name => 'MOVEMENT_STEPS_ACC_DEC_Y',
60
+ :id => 42,
61
+ :value => 100
62
+ },
63
+ {
64
+ :name => 'MOVEMENT_STEPS_ACC_DEC_Z',
65
+ :id => 43,
66
+ :value => 100
67
+ },
68
+ {
69
+ :name => 'MOVEMENT_HOME_UP_X',
70
+ :id => 51,
71
+ :value => 0
72
+ },
73
+ {
74
+ :name => 'MOVEMENT_HOME_UP_Y',
75
+ :id => 52,
76
+ :value => 0
77
+ },
78
+ {
79
+ :name => 'MOVEMENT_HOME_UP_Z',
80
+ :id => 53,
81
+ :value => 0
82
+ },
83
+ {
84
+ :name => 'MOVEMENT_MIN_SPD_X',
85
+ :id => 61,
86
+ :value => 200
87
+ },
88
+ {
89
+ :name => 'MOVEMENT_MIN_SPD_Y',
90
+ :id => 62,
91
+ :value => 200
92
+ },
93
+ {
94
+ :name => 'MOVEMENT_MIN_SPD_Z',
95
+ :id => 63,
96
+ :value => 200
97
+ },
98
+ {
99
+ :name => 'MOVEMENT_MAX_SPD_X',
100
+ :id => 71,
101
+ :value => 1000
102
+ },
103
+ {
104
+ :name => 'MOVEMENT_MAX_SPD_Y',
105
+ :id => 72,
106
+ :value => 1000
107
+ },
108
+ {
109
+ :name => 'MOVEMENT_MAX_SPD_Z',
110
+ :id => 73,
111
+ :value => 1000
112
+ },
113
+ {
114
+ :name => 'MOVEMENT_LENGTH_X',
115
+ :id => 101,
116
+ :value => 1000
117
+ },
118
+ {
119
+ :name => 'MOVEMENT_LENGTH_Y',
120
+ :id => 102,
121
+ :value => 1000
122
+ },
123
+ {
124
+ :name => 'MOVEMENT_LENGTH_Z',
125
+ :id => 103,
126
+ :value => 1000
127
+ },
128
+ {
129
+ :name => 'MOVEMENT_STEPS_PER_UNIT_X',
130
+ :id => 111,
131
+ :value => 5
132
+ },
133
+ {
134
+ :name => 'MOVEMENT_STEPS_PER_UNIT_Y',
135
+ :id => 112,
136
+ :value => 5
137
+ },
138
+ {
139
+ :name => 'MOVEMENT_STEPS_PER_UNIT_Z',
140
+ :id => 113,
141
+ :value => 5
142
+ },
143
+ {
144
+ :name => 'TESTING',
145
+ :id => 1,
146
+ :value => 0
147
+ }
148
+ ]
@@ -0,0 +1,9 @@
1
+ require 'serialport'
2
+ require 'serial_port_sim'
3
+ require 'status'
4
+ require 'arduino_default_params'
5
+ require 'hardware_interface_arduino'
6
+ require 'hardware_interface_param'
7
+ require 'hardware_interface'
8
+ require 'hardware_interface_arduino_values_received'
9
+ require 'hardware_interface_arduino_write_status'
@@ -0,0 +1,210 @@
1
+ ## HARDWARE INTERFACE
2
+ ## ******************
3
+
4
+ # Communicate with the arduino using a serial interface
5
+ # All information is exchanged using a variation of g-code
6
+ # Parameters are stored in the database
7
+ module Fb
8
+ class HardwareInterface
9
+ class << self
10
+ attr_accessor :current
11
+
12
+ def current
13
+ @current ||= self.new(true)
14
+ end
15
+ end
16
+
17
+ attr_reader :ramps_param, :ramps_main, :ramps_arduino
18
+ attr_accessor :status
19
+
20
+ # initialize the interface
21
+ #
22
+ def initialize(test_mode)
23
+ @status = Fb::Status.new
24
+ @test_mode = test_mode
25
+
26
+ # create the sub processing objects
27
+ @ramps_param = Fb::HardwareInterfaceParam.new
28
+ @ramps_arduino = Fb::HardwareInterfaceArduino.new(test_mode)
29
+
30
+ @ramps_arduino.ramps_param = @ramps_param
31
+ @ramps_arduino.ramps_main = self
32
+ @ramps_param.ramps_arduino = @ramps_arduino
33
+ @ramps_param.ramps_main = self
34
+
35
+ @external_info = ""
36
+
37
+ end
38
+
39
+ ## INTERFACE FUNCTIONS
40
+ ## *******************
41
+
42
+ ## control additional I/O (servo, pins, water)
43
+
44
+ # move a servo
45
+ #
46
+ def servo_std_move(pin, value)
47
+ @ramps_arduino.execute_command("F61 P#{pin} V#{value}", false, @status_debug_msg)
48
+ end
49
+
50
+ # set standard pin value
51
+ #
52
+ def pin_std_set_value(pin, value, mode)
53
+ @ramps_arduino.execute_command("F41 P#{pin} V#{value} M#{mode}", false, @status_debug_msg)
54
+ end
55
+
56
+ # read standard pin
57
+ #
58
+ def pin_std_read_value(pin, mode, external_info)
59
+ @ramps_arduino.external_info = external_info
60
+ @ramps_arduino.execute_command("F42 P#{pin} M#{mode}", false, @status_debug_msg)
61
+ @external_info = ''
62
+ end
63
+
64
+ # set standard pin mode
65
+ #
66
+ def pin_std_set_mode(pin, mode)
67
+ @ramps_arduino.execute_command("F43 P#{pin} M#{mode}", false, @status_debug_msg)
68
+ end
69
+
70
+ # set pulse on standard pin
71
+ #
72
+ def pin_std_pulse(pin, value1, value2, time, mode)
73
+ @ramps_arduino.execute_command("F44 P#{pin} V#{value1} W#{value2} T#{time} M#{mode}", false, @status_debug_msg)
74
+ end
75
+
76
+ # dose an amount of water (in ml)
77
+ #
78
+ def dose_water(amount)
79
+ @ramps_arduino.execute_command("F01 Q#{amount.to_i}", false, @status_debug_msg)
80
+ end
81
+
82
+ ## arduino status
83
+
84
+ # read end stop status from the device
85
+ #
86
+ def read_end_stops()
87
+ @ramps_arduino.execute_command('F81', false, @status_debug_msg)
88
+ end
89
+
90
+ # read current coordinates from the device
91
+ #
92
+ def read_postition()
93
+ @ramps_arduino.execute_command('F82', false, @status_debug_msg)
94
+ end
95
+ # read current software version
96
+ #
97
+ def read_device_version()
98
+ @ramps_arduino.execute_command('F83', false, @status_debug_msg)
99
+ end
100
+
101
+ ## basic movements
102
+
103
+ # move all axis home
104
+ #
105
+ def move_home_all
106
+ status.info_target_x = 0
107
+ status.info_target_y = 0
108
+ status.info_target_z = 0
109
+ @ramps_arduino.execute_command('G28', true, false)
110
+ end
111
+
112
+ # move the bot to the home position
113
+ #
114
+ def move_home_x
115
+ status.info_target_x = 0
116
+ @ramps_arduino.execute_command('F11', true, false)
117
+ end
118
+
119
+ # move the bot to the home position
120
+ #
121
+ def move_home_y
122
+ status.info_target_y = 0
123
+ @ramps_arduino.execute_command('F12', true, false)
124
+ end
125
+
126
+ # move the bot to the home position
127
+ #
128
+ def move_home_z
129
+ status.info_target_z = 0
130
+ @ramps_arduino.execute_command('F13', true, false)
131
+ end
132
+
133
+ # calibrate x axis
134
+ #
135
+ def calibrate_x
136
+ status.info_target_x = 0
137
+ @ramps_arduino.execute_command('F14', true, false)
138
+ end
139
+
140
+ # calibrate y axis
141
+ #
142
+ def calibrate_y
143
+ status.info_target_y = 0
144
+ @ramps_arduino.execute_command('F15', true, false)
145
+ end
146
+
147
+ # calibrate z axis
148
+ #
149
+ def calibrate_z
150
+ status.info_target_z = 0
151
+ @ramps_arduino.execute_command('F16', true, false)
152
+ end
153
+
154
+ # move the bot to the give coordinates
155
+ #
156
+ def move_absolute( coord_x, coord_y, coord_z)
157
+
158
+ status.info_target_x = coord_x
159
+ status.info_target_y = coord_y
160
+ status.info_target_z = coord_z
161
+
162
+ # calculate the number of steps for the motors to do
163
+
164
+ steps_x = coord_x * @ramps_param.axis_x_steps_per_unit
165
+ steps_y = coord_y * @ramps_param.axis_y_steps_per_unit
166
+ steps_z = coord_z * @ramps_param.axis_z_steps_per_unit
167
+
168
+ move_to_coord(steps_x, steps_y, steps_z )
169
+
170
+ end
171
+
172
+ # move the bot a number of units starting from the current position
173
+ #
174
+ def move_relative( amount_x, amount_y, amount_z)
175
+
176
+ # calculate the number of steps for the motors to do
177
+
178
+ status.info_target_x = status.info_current_x + amount_x
179
+ status.info_target_y = status.info_current_y + amount_y
180
+ status.info_target_z = status.info_current_z + amount_z
181
+
182
+ steps_x = amount_x * @ramps_param.axis_x_steps_per_unit + status.info_current_x_steps
183
+ steps_y = amount_y * @ramps_param.axis_y_steps_per_unit + status.info_current_y_steps
184
+ steps_z = amount_z * @ramps_param.axis_z_steps_per_unit + status.info_current_z_steps
185
+
186
+ move_to_coord( steps_x, steps_y, steps_z )
187
+
188
+ end
189
+
190
+ # drive the motors so the bot is moved a number of steps
191
+ #
192
+ def move_steps(steps_x, steps_y, steps_z)
193
+ @ramps_arduino.execute_command("G01 X#{steps_x.to_i} Y#{steps_y.to_i} Z#{steps_z.to_i}", true, false)
194
+ end
195
+
196
+ # drive the motors so the bot is moved to a set location
197
+ #
198
+ def move_to_coord(steps_x, steps_y, steps_z)
199
+ @ramps_arduino.execute_command("G00 X#{steps_x.to_i} Y#{steps_y.to_i} Z#{steps_z.to_i}", true, false)
200
+ end
201
+
202
+ ## parameter hanlding
203
+
204
+ def check_parameters
205
+ @ramps_param.check_parameters()
206
+ end
207
+
208
+ end
209
+
210
+ end