Projekte

KinderChocolateBot

Zu Weihnachten habe ich mir bisl Zeit genommen und wollte etwas mit Servo und NETMF machen. Brauche immer ein Projekt welches auch Sinn macht… Naja ob das Resultat sinnig ist, darf jeder selber Entscheiden.

Eigentlich sollte ich das Projekt unter Homeautomation einstellen, da es mir jeden Tag Zeit spart. Denn wir lieben Kinderschokolade :^)

Bevor ich aber jedes Mal alles rauskrame, dachte ich mir wäre doch ein Roboter, welcher mir die Arbeit abnimmt, sinnvoll.

Lego

Gesagt getan, endlich wieder mit Legos etwas bauen, passt irgendwie zu Weihnachten.

Bau 1 Bau 2

Bau Vorne Bau Hinten

Bau 3 Schalter

 

Rückansicht Seitlich Links

Seitlich Rechts Vorne

Folgende Komponenten wurden verbaut:

Gesamtkosten ca. 56€ was nicht gerade billig ist. Achja, Lego hatte ich schon, sonst wären es wahrscheinlich locker über 100€.

Das programmieren des Servos ist nicht ganz so einfach mit NETMF aufgrund fehlender Libraries für die Taktzeiten… hab mir bisl was zusammengesucht, denke aber ist nicht das beste Setup, da hier viel manuell gerechnet wurde (Clocktime). Da ist wohl ein nicht NETMF Controller besser.

Aber es funktioniert wie es sollte und schaut auch gut aus :^)

using Gadgeteer;
using Servo_API;
using Button = Gadgeteer.Modules.GHIElectronics.Button;

namespace Program
{
    public partial class Program
    {
        Servo servo; 
        private bool IsRunning;

        void ProgramStarted()
        {
            Debug("Set it UUUUP!");

            // Setup
            Mainboard.SetDebugLED(true);
            button.ButtonPressed += ButtonOnButtonPressed;
        }

        private void ButtonOnButtonPressed(Button sender, Button.ButtonState state)
        {
            if (!IsRunning)
            {
                Debug("Chocolate!");
                
                ledLeft.FadeOnce(Color.Red);
                ledRight.FadeOnce(Color.Red);

                IsRunning = true;

                servo = new Servo(extender);
                servo.Degree = -180;
                servo.Dispose();

                IsRunning = false;

                Debug("Bedtime!");                
            }
        }

        void Debug(string text)
        {
            Microsoft.SPOT.Debug.Print("==> " + text);
        }
    }
}
// Orginal http://stackoverflow.com/questions/22699174/netduino-class-servo-4-3-1

using Gadgeteer;
using Gadgeteer.Modules;
using Microsoft.SPOT.Hardware;
using System;
using System.Threading;

namespace Servo_API
{
    public class Servo : IDisposable
    {
        /// <summary>
        /// PWM handle
        /// </summary>
        private PWM servo;

        /// <summary>
        /// Timings range
        /// </summary>
        private int[] range = new int[2];

        /// <summary>
        /// Set servo inversion
        /// </summary>
        public bool inverted = false;

        /// <summary>
        /// Create the PWM Channel, set it low and configure timings
        /// </summary>
        public Servo(Module module)
        {
            // Init the PWM pin
            // servo = new PWM((Cpu.PWMChannel)channelPin, 20000, 1500, PWM.ScaleFactor.Microseconds, false);
            Socket SocketExtender = Socket.GetSocket(4, true, module, "socketExtender");
            servo = new PWM(SocketExtender.PWM9, 20000, 1500, PWM.ScaleFactor.Microseconds, false);
            servo.Period = 20000;

            // Typical settings
            range[0] = 900;
            range[1] = 2100;
        }

        public void Dispose()
        {
            disengage();
            servo.Dispose();
        }

        /// <summary>
        /// Allow the user to set cutom timings
        /// </summary>
        /// <param name="fullLeft"></param>
        /// <param name="fullRight"></param>
        public void setRange(int fullLeft, int fullRight)
        {
            range[1] = fullLeft;
            range[0] = fullRight;
        }

        /// <summary>
        /// Disengage the servo. 
        /// The servo motor will stop trying to maintain an angle
        /// </summary>
        public void disengage()
        {
            // See what the Netduino team say about this... 
            servo.DutyCycle = 0; //SetDutyCycle(0);
        }

        /// <summary>
        /// Set the servo degree
        /// </summary>
        public double Degree
        {
            set
            {
                // Range checksJa
                if (value > 180)
                    value = 180;

                if (value < 0)
                    value = 0;

                // Are we inverted?
                if (inverted)
                    value = 180 - value;

                // Set the pulse
                //servo.SetPulse(20000, (uint)map((long)value, 0, 180, range[0], range[1]));
                servo.Duration = (uint)map((long)value, 0, 180, range[0], range[1]);
                servo.Start();
                Thread.Sleep(360);
            }
        }


        private long map(long x, long in_min, long in_max, long out_min, long out_max)
        {
            return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
        }
    }
}
Von |2018-05-14T15:23:21+02:002015-03-10|Gadgeteer, NETMF, Projekte|

Doorbell – Update: Pushbullet

Aufgrund eines Kommentars habe ich mir mal den Dienst Pushbullet angesehen.

Vorteil ist hier dass es eine Vorschau für Dateien (wie in unserem Fall Bilder) gibt.

Pushbullet

Leider gab es genau bei meinem Test ein Problem mit Pushnotifications unter iOS 8 … der Bug scheint behoben zu sein, dennoch pusht der Dienst nicht so zuverlässig wie Pushover. Ich teste nun ein bisschen mit beiden Diensten gleichzeitig. Aber eine Vorschau der Bilder ist natürlich schon ein Vorteil.

# Pushbullet
print("--> Pushbullet")
logger.info("--> Pushbullet")
pb = PushBullet("API-Token")

with open('/home/pi/Desktop/doorbell/web/photos/' +  filename, "rb") as pic:
    success, file_data = pb.upload_file(pic, filename + '.jpg')

success, push = pb.push_file(**file_data)
Von |2014-10-07T12:00:49+02:002014-10-07|Doorbell, Projekte, Raspberry Pi|

Doorbell – Update: Bildgröße

Eigentlich wollte ich Heute die Notification auf Email umstellen, nach einem Test hab ich es aber wieder verworfen, da es mir eigentlich nur Nachteile bringt.

Wollte das Bild direkt in der Email einbetten, aber dann muss ich jedes mal den Mailserver ärgern und das Bild hochladen, dass muss doch nicht sein :)

Da viel mir ein, als ich in Italien war auf ca. 3200m und wollte sehen wer denn gerade Daheim klingelt, dauerte dies ewig. Ich hatte ca. zwei Balken EDGE (durch EU-Day Pack kostet zum Glück das Internet nicht viel).

Die Dateigröße der Bilder ist jeweils zwischen 2-3MB, was eindeutig zu viel ist.

Nun wusste ich bereits dass es den Parameter –quality gibt, also habe ich diesen hinzugefügt. Als Wert gibt man die gewünschte Qualität in Prozent an… getestet mit 80, nix bemerkt. Komisch…

Anscheinend komprimiert raspistill nicht so stark… habe testweise den Parameterwert auf 10 gesetzt und siehe da, 315k bei HD.

Das ist vollkommen in Ordnung und die Qualität ist immer noch super.

Anbei der Vergleich:

  • Links: Hohe Auflösung 80% (2,1MB)
  • Rechts: Niedrige Auflösung 10% (315KB)

Hohe Auflösung Niedrige Auflösung

@Rotstich: Es ist gerade Abenddämmerung (20Uhr)
@Rasen: Da es eine IR-Kamera ist, sind die Farben nicht Orginal, dafür nimmt es super Bilder in der Nacht auf :)

Projektübersicht

 

Von |2014-07-24T12:14:33+02:002014-04-18|Coding, Doorbell, Projekte, Raspberry Pi|
Nach oben