X-Git-Url: http://nitlanguage.org diff --git a/lib/bcm2835.nit b/lib/bcm2835.nit index cb9575a..aac7352 100644 --- a/lib/bcm2835.nit +++ b/lib/bcm2835.nit @@ -440,7 +440,7 @@ class HD44780 clear return_home var count = 0 - for c in v do + for c in v.chars do if c == '\n' then # FIXME, this should work #write(true, "C0".to_hex) @@ -457,3 +457,116 @@ class HD44780 self.last_text = v end end + +# Component for any kind of buttons or switches +class Switch + var pin: RPiPin + + init (pin: RPiPin, pud: PUDControl) + do + self.pin = pin + pin.fsel = new FunctionSelect.inpt + pin.pud = pud + end + + fun is_down: Bool do return pin.lev + + var last_down: nullable Bool = null + + # Returns true is state (is_down) changed since last call to `changed` + fun changed: Bool + do + var now = is_down + var last_down = last_down + if last_down == null then + self.last_down = now + return false + else if last_down != now then + self.last_down = now + return true + else return false + end +end + +class StepperMotor + var pins: Sequence[RPiPin] + var delay: Int + + init (delay: Int, a, b, c, d: RPiPin) + do + pins = [a, b, c, d] + self.delay = delay + + for p in pins do p.fsel = new FunctionSelect.outp + end + + fun forward(steps: Int) + do + for s in [0..steps[ do + set(true, false, false, false) + delay.bcm2835_delay + set(true, true, false, false) + delay.bcm2835_delay + set(false, true, false, false) + delay.bcm2835_delay + set(false, true, true, false) + delay.bcm2835_delay + set(false, false, true, false) + delay.bcm2835_delay + set(false, false, true, true) + delay.bcm2835_delay + set(false, false, false, true) + delay.bcm2835_delay + set(true, false, false, true) + delay.bcm2835_delay + end + end + + fun backwards(steps: Int) + do + for s in [0..steps[ do + set(true, false, false, true) + delay.bcm2835_delay + set(false, false, false, true) + delay.bcm2835_delay + set(false, false, true, true) + delay.bcm2835_delay + set(false, false, true, false) + delay.bcm2835_delay + set(false, true, true, false) + delay.bcm2835_delay + set(false, true, false, false) + delay.bcm2835_delay + set(true, true, false, false) + delay.bcm2835_delay + set(true, false, false, false) + delay.bcm2835_delay + end + end + + fun release do set(false, false, false, false) + + protected fun set(a, b, c, d: Bool) + do + var bits = new Array[Bool].with_items(a, b, c, d) + + for i in [0..4[ do pins[i].write(bits[i]) + end +end + +class Buzzer + var pin: RPiPin + + fun buzz(delay: Float, times: Int) + do + assert times > 0 + assert delay > 0.0 + var delay_i = (delay*1000.0).to_i + for i in [0..times[ do + pin.write(true) + delay_i.bcm2835_delay_micros + pin.write(false) + delay_i.bcm2835_delay_micros + end + end +end