Archiv der Kategorie: Uncategorized

Motorbrücke L9110s

Hier ein paar Informationen über die Motorbrücke L9110s. Ich habe ein Modul mit zwei dieser Treiber hier im Einsatz. Ein Hauptvorteil dieses Moduls ist der geringe Preis. Ein Nachteil ist die geringe Stromabgabe die ihn für größere Motoren unbrauchbar macht.

Zur Steuerung der Motoren sind jeweils zwei Pins pro Motor nötig.

Laut dateblatt ist die Beschaltung wie folgt:

Vorwärts:

Pin1 – PWM-Signal für die Geschwindigkeit
Pin2 – Auf Masse

Rückwärts:

Pin1 – Auf Massse
Pin2 – PWM-Signal für die Geschwindigkeit

! Die Beschaltung wie bei Anderen Motorbrücken z.B. L293 .. :

Pin1 – gibt die Geschwindigkeit mit Hilfe einen PWM Signals vor
Pin2 – gibt die Richtung mit digital High/Low vor.

Hat mit diesem Modul nicht funktioniert.

Es gibt jedoch einen Trick um trotzdem nur 2 PWM Pins verwenden zu können:

Vorwärts:

Pin1 – PWM-Signal für die Geschwindigkeit
Pin2 – Auf Masse

Rückwärts:

Pin1 – PWM-Max – PWM-Signal für die Geschwindigkeit
Pin2 – Auf VCC.

PWM-Max ist hierbei der maximale Wert bei dem Der PWM über die komplette Periodendauer auf High ist. Beispiel PWM von 0-255. dann ist PWM-Max = 255.

Technische Daten

BeschreibungWert
Anz. Motor2
TreibershipL9110s
VCCmin2,5V
VCCmax12V
Imax0,8A
Größe2,8 cm x 2,1 cm
Preis~ 0,60€

Beschaltung des Modules

Beschaltung aus dem Datenblatt

Vorwärts

A-1A – PWM signal gibt die Geschwindigkeit an
A-1B – auf Masse

B1A – PWM signal gibt die Geschwindigkeit an
B1B- auf Masse

Rückwärts

A-1A – auf Masse
A-1B – PWM signal gibt die Geschwindigkeit an

B1A – auf Masse
B1B- PWM signal gibt die Geschwindigkeit an

Links? drehen

A-1A – PWM signal gibt die Geschwindigkeit an
A-1B – auf Masse

B1A – auf Masse
B1B- PWM signal gibt die Geschwindigkeit an

Rechts? Drehen

A-1A – auf Masse
A-1B – PWM signal gibt die Geschwindigkeit an

B1A – PWM signal gibt die Geschwindigkeit an
B1B – auf Masse

Mit nur 2 PWMs

PWM-Max = 1000

Vorwärts

A-1A – PWM Signal gibt die Geschwindigkeit an
A-1B – auf Masse

B1A – PWM Signal gibt die Geschwindigkeit an
B1B- auf Masse

Rückwärts

A-1A – 1000 – PWM Signal gibt die Geschwindigkeit an
A-1B – auf Vcc

B1A – 1000 PWM Signal gibt die Geschwindigkeit an
B1B- auf Vcc

Links? drehen

A-1A – PWM Signal gibt die Geschwindigkeit an
A-1B – auf Masse

B1A – 1000 – PWM Signal gibt die Geschwindigkeit an
B1B – auf Vcc

Rechts? Drehen

A-1A – 1000 – PWM Signal gibt die Geschwindigkeit an
A-1B – auf Vcc

B1A – PWM Signal gibt die Geschwindigkeit an
B1B – auf Masse

Quellen

Datenblatt l9110
Datenblatt Platine

Anhang

Mit dem Raspberry PI 3 den Entfernungsmesser US-100 ansteuern

Ansteuerung eines Ultraschall-Entfernungsmessers US-100 mit dem Raspberry PI3 ( oder früher). Ich habe nur Tutorials für den SR-04 gefunden, dieser wird allerdings analog zum US-100 eingebunden.


Hardware

PI3 (oder älter bitte auf die richtigen Pins achten)
US-100 ( Ultraschallsensor)
Brot-Board (zum leichteren Aufbau)
Diverse Kabel ( Vorgefertigte Pin-Header Kabel)


Aufbau

Der US-100 arbeitet mit 3.3V womit man ihn direkt am Raspberry betreiben kann.

Verdrahtung

  • Trigger Pin am GPIO 28
  • Echo Pin an den GPIO 25

(Die GPIOs gelten nur in Verbindung mit pi4j und wirePi)

 


Software

Entwicklungsumgebung

Als Entwicklungsumgebung verwende ich BlueJ auf dem PI selbst. Hiermit habe ich zwei Klassen erstellt.


Code

Distance-Klasse

Klasse zur Steuerung des US-015, mit den Methoden

  • getDistanceMM – Entfernung in Millimetern
  • getDistanceCM – Entfernung in Zentimetern

157-2

import com.pi4j.io.gpio.GpioPinDigitalInput;
import com.pi4j.io.gpio.GpioPinDigitalOutput;

public class Distance
{
    // instance variables - replace the example below with your own

    
    
    public static final int     DIVISOR               = 58200;
    public static final int     ERROR_NO_MEASUREMENT  = -1;
    public static final int     ERROR_DIST_TO_SHORT   = -2;
    
    private GpioPinDigitalInput     echo        = null;
    private GpioPinDigitalOutput    trigger     = null;
    private long                     timeOut     = 250000000; // in ns/ time for 4m for 20°C ~232
    private long                     triggerTime = 2;   // 10ms for SR04, 2 for US-100
    private long                     initTime    = 2;    // default 2 ms
      
    /**
     * Constructor for objects of class Distance
     */
    public Distance(GpioPinDigitalOutput trigger, GpioPinDigitalInput echo)
    {
        this.echo = echo;
        this.trigger = trigger;

    }
    
    /**
     * get the distance in mm
     */
    public double getDistMM()
    {
        return aquire()*1000;
    }
    
     /**
     * get the distance in cm
     */
    public double getDistCM()
    {
        return aquire();
    }
    
    /** 
     * returns the time in milli xeconds
     */
    public double aquire(){
        long start = 0;
        double diff = 0;

        try {
           
          trigger.low();
          Thread.sleep(initTime);
          trigger.high();
          Thread.sleep(triggerTime);
          trigger.low();
    
          while (echo.isLow()) {
            start = System.nanoTime();
          }
    
          while (echo.isHigh()) {
              //System.out.print((System.nanoTime() - start)+",");
              if((System.nanoTime() - start) > timeOut){
                  return ERROR_NO_MEASUREMENT;
              }
          }
    
          // check if distance is to short and return errror
          diff =  ((System.nanoTime() - start) / DIVISOR );
          return diff;
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
        return -1.0;
    }
}

Test-Klasse

Klasse mit Main-Methode zum Testen der Distance-Klasse. In der Main-Methode wird alle 5 Sekunde ein neuer Wert vom Sensor abgefragt und auf die Console geschrieben.

159-2

import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinDigitalOutput;
import com.pi4j.io.gpio.GpioPinDigitalInput;
import com.pi4j.io.gpio.GpioPin;
import com.pi4j.io.gpio.Pin;
import com.pi4j.io.gpio.PinState;
import com.pi4j.io.gpio.RaspiPin;
import com.pi4j.io.gpio.PinPullResistance;

public class TestDistance
{

    public static void main(String args[]){
        final GpioController gpio = GpioFactory.getInstance();

        //range sensor pins
        GpioPinDigitalOutput sensor_trigger = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_28, 
                "Sensor Trigger", PinState.LOW);

        GpioPinDigitalInput sensor_echo = gpio.provisionDigitalInputPin(RaspiPin.GPIO_25, 
                "Sensor Echo", PinPullResistance.PULL_DOWN);

        // Create the range sensor
        Distance rangesensor = new Distance(sensor_trigger, sensor_echo);
        int i = 0;
        do {
            i++;
            // Get the range
            double distance = rangesensor.getDistCM();
            
            System.out.println("RangeSensorresult =" + distance + "cm");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        } while (i < 1000);
        

        gpio.unprovisionPin(gpio.getProvisionedPins().toArray(new GpioPin[]{sensor_trigger, sensor_echo}));
        
    }
}

Tips

Bei größerer Beanspruchung des PI ist zu beachten, dass Java die zeitlichen Abfolgen nicht garantiert. Somit kann es zu verfälschten oder keinen Ergebnissen bei der Messung kommen.

Quellen

https://www.modmypi.com/blog/hc-sr04-ultrasonic-range-sensor-on-the-raspberry-pi

http://t1m0b0t.blogspot.de/2014/04/using-ultrasonic-range-sensor-on.html

http://www.lediouris.net/RaspberryPI/HC-SR04/readme.htmlhttps://github.com/OlivierLD/raspberry-pi4j-samples/tree/master/RangeSensor

http://pi4j.com/pins/model-3b-rev1.html

Interfacing HC-SR04 Ultrasonic Sensor with Raspberry Pi

 

Entfernung messen mit Ultraschallsensor HC-SR04 – Raspberry Pi

Anhang

Pin-Belegung