From 7b62d329f964a9bd055983745a6c10395d7c99c2 Mon Sep 17 00:00:00 2001
From: ntruchsess <>
Date: Sat, 2 Feb 2013 17:54:39 +0000
Subject: [PATCH] fix servo
git-svn-id: https://svn.fhem.de/fhem/trunk@2635 2b470e98-0d58-463d-a4d8-8e2adae1ed80
---
fhem/FHEM/10_FRM.pm | 2 +-
fhem/FHEM/20_FRM_PWM.pm | 13 +++++++++++--
fhem/FHEM/20_FRM_SERVO.pm | 13 +++++++++++--
fhem/FHEM/lib/Device/Firmata/Platform.pm | 14 +++++++++++---
4 files changed, 34 insertions(+), 8 deletions(-)
diff --git a/fhem/FHEM/10_FRM.pm b/fhem/FHEM/10_FRM.pm
index 6b37a06b6..2bd37b967 100755
--- a/fhem/FHEM/10_FRM.pm
+++ b/fhem/FHEM/10_FRM.pm
@@ -20,7 +20,7 @@ sub FRM_Initialize($) {
# Provider
$hash->{Clients} =
- ":FRM_IN:FRM_OUT:FRM_AD:FRM_PWM:FRM_I2C:OWX:";
+ ":FRM_IN:FRM_OUT:FRM_AD:FRM_PWM:FRM_I2C:FRM_SERVO:OWX:";
$hash->{ReadyFn} = "FRM_Ready";
$hash->{ReadFn} = "FRM_Read";
diff --git a/fhem/FHEM/20_FRM_PWM.pm b/fhem/FHEM/20_FRM_PWM.pm
index 0617240f6..74063842c 100755
--- a/fhem/FHEM/20_FRM_PWM.pm
+++ b/fhem/FHEM/20_FRM_PWM.pm
@@ -7,6 +7,11 @@ use Device::Firmata;
use Device::Firmata::Constants qw/ :all /;
#####################################
+
+my %sets = (
+ "value" => "",
+);
+
sub
FRM_PWM_Initialize($)
{
@@ -37,7 +42,11 @@ sub
FRM_PWM_Set($@)
{
my ($hash, @a) = @_;
- my $value = $a[1];
+ return "Need at least one parameters" if(@a < 2);
+ return "Unknown argument $a[1], choose one of " . join(" ", sort keys %sets)
+ if(!defined($sets{$a[1]}));
+ my $command = $a[1];
+ my $value = $a[2];
my $iodev = $hash->{IODev};
if (defined $iodev and defined $iodev->{FirmataDevice} and defined $iodev->{FD}) {
$iodev->{FirmataDevice}->analog_write($hash->{PIN},$value);
@@ -79,7 +88,7 @@ FRM_PWM_Undef($$)
Set
- set <name> <value>
+ set <name> value <value>
sets the pulse-width of the signal that is output on the configured arduino pin
Range is from 0 to 255 (see analogWrite() for details)
diff --git a/fhem/FHEM/20_FRM_SERVO.pm b/fhem/FHEM/20_FRM_SERVO.pm
index 6d3372881..c47d8f86e 100755
--- a/fhem/FHEM/20_FRM_SERVO.pm
+++ b/fhem/FHEM/20_FRM_SERVO.pm
@@ -7,6 +7,11 @@ use Device::Firmata;
use Device::Firmata::Constants qw/ :all /;
#####################################
+
+my %sets = (
+ "angle" => "",
+);
+
sub
FRM_SERVO_Initialize($)
{
@@ -60,7 +65,11 @@ sub
FRM_SERVO_Set($@)
{
my ($hash, @a) = @_;
- my $value = $a[1];
+ return "Need at least one parameters" if(@a < 2);
+ return "Unknown argument $a[1], choose one of " . join(" ", sort keys %sets)
+ if(!defined($sets{$a[1]}));
+ my $command = $a[1];
+ my $value = $a[2];
my $iodev = $hash->{IODev};
if (defined $iodev and defined $iodev->{FirmataDevice} and defined $iodev->{FD}) {
$iodev->{FirmataDevice}->servo_write($hash->{PIN},$value);
@@ -102,7 +111,7 @@ FRM_SERVO_Undef($$)
Set
- set <name> <value>
sets the angle of the servo-motors shaft to the value specified (in degrees).
+ set <name> angle <value>
sets the angle of the servo-motors shaft to the value specified (in degrees).
Get
diff --git a/fhem/FHEM/lib/Device/Firmata/Platform.pm b/fhem/FHEM/lib/Device/Firmata/Platform.pm
index a5d795912..27a9834a1 100644
--- a/fhem/FHEM/lib/Device/Firmata/Platform.pm
+++ b/fhem/FHEM/lib/Device/Firmata/Platform.pm
@@ -436,7 +436,7 @@ sub pin_mode {
last;
};
- ( $mode == PIN_PWM || $mode == PIN_I2C || $mode == PIN_ONEWIRE ) and do {
+ ( $mode == PIN_PWM || $mode == PIN_I2C || $mode == PIN_ONEWIRE || $mode == PIN_SERVO ) and do {
$self->{io}->data_write($self->{protocol}->message_prepare( SET_PIN_MODE => 0, $pin, $mode ));
last;
};
@@ -594,9 +594,17 @@ sub i2c_config {
}
sub servo_write {
+
+ # --------------------------------------------------
+ # Sets the SERVO value on an arduino
+ #
my ( $self, $pin, $value ) = @_;
- return undef unless $self->is_configured_mode($pin,PIN_SERVO);
- return analog_write( $self, $pin, $value );
+ return undef unless $self->is_configured_mode($pin,PIN_SERVO);
+
+ # FIXME: 8 -> 7 bit translation should be done in the protocol module
+ my $byte_0 = $value & 0x7f;
+ my $byte_1 = $value >> 7;
+ return $self->{io}->data_write($self->{protocol}->message_prepare( ANALOG_MESSAGE => $pin, $byte_0, $byte_1 ));
}
sub servo_config {