Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Repo info
Activity
  • Feb 19 23:59
    EhsanMasoumi opened #478
  • Feb 08 13:28
    Vicckkky commented #475
  • Feb 08 13:28
    Vicckkky commented #475
  • Jan 19 04:45
    vindicatorr opened #477
  • Jan 10 10:43
    fhainz commented #417
  • Jan 05 00:46
    kxm-alb edited #476
  • Jan 05 00:43
    kxm-alb edited #476
  • Jan 05 00:41
    kxm-alb edited #476
  • Jan 05 00:40
    kxm-alb edited #476
  • Jan 05 00:38
    kxm-alb edited #476
  • Jan 05 00:37
    kxm-alb opened #476
  • Dec 23 2020 07:18
    PizzaProgram closed #473
  • Dec 23 2020 07:18
    PizzaProgram commented #473
  • Dec 05 2020 08:29
    soundanalogous labeled #475
  • Dec 04 2020 12:14
    robobibble opened #475
  • Dec 02 2020 18:34
    dtex commented #471
  • Dec 02 2020 07:48
    xiebin2014 closed #467
  • Dec 02 2020 07:48
    xiebin2014 commented #467
  • Dec 01 2020 02:39
    PizzaProgram commented #471
  • Dec 01 2020 01:56
    PizzaProgram commented #471
Clive Galway
@evilC
but it can be sparse
ah I see, bits
duh
yeah I see, much bigger
4 bits to desribe which pin in port, plus 1 for state
Jeff Hoefs
@soundanalogous
Here's an example of parsing a digital message in firmata.js: https://github.com/firmata/firmata.js/blob/master/lib/firmata.js#L124-L149
Clive Galway
@evilC
I don't think I would have any trouble in doing it, I already have to do similar things when I process DirectInput and XInput
Clive Galway
@evilC
        private Dictionary<int, bool> pinStates = new Dictionary<int, bool>();

        private void Session_OnDigitalStateReceived(object sender, FirmataEventArgs<DigitalPortState> eventArgs)
        {
            var basePin = eventArgs.Value.Port * 8;
            for (var portPin = 0; portPin < 8; portPin++)
            {
                var fullPin = basePin + portPin;
                var isSet = eventArgs.Value.IsSet(portPin);
                if (!pinStates.ContainsKey(fullPin))
                {
                    pinStates.Add(fullPin, !isSet);
                }
                if (isSet == pinStates[fullPin]) continue;
                pinStates[fullPin] = isSet;
                Console.WriteLine($"Port {eventArgs.Value.Port}, Pin {portPin} (Pin #{fullPin}) changed to {isSet}");
            }
        }
I spose I may need to check if mode is pullup and stuff tho?
as from what I can tell, in pullup mode, unpressed is 1, but in normal mode, 0 is unpressed?
Clive Galway
@evilC
Hmm, the C# library does not seem to have a GetDigitalPinMode()
Clive Galway
@evilC
using Solid.Arduino;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Solid.Arduino.Firmata;

namespace FermataTest
{
    public class Class1
    {
        private readonly ArduinoSession _session;
        private readonly Dictionary<int, bool> _pinStates = new Dictionary<int, bool>();
        private readonly Dictionary<int, PinMode> _pinModes = new Dictionary<int, PinMode>();

        public Class1()
        {
            var connection = GetConnection();
            _session = new ArduinoSession(connection);

            SubscribeDigitalPin(2, PinMode.InputPullup);
            SubscribeDigitalPin(3, PinMode.InputPullup);
            SubscribeDigitalPin(4, PinMode.InputPullup);
            SubscribeDigitalPin(5, PinMode.InputPullup);
            SubscribeDigitalPin(6, PinMode.InputPullup);
            SubscribeDigitalPin(7, PinMode.InputPullup);
            SubscribeDigitalPin(8, PinMode.InputPullup);
            SubscribeDigitalPin(9, PinMode.InputPullup);
            SubscribeDigitalPin(10, PinMode.InputPullup);
            SubscribeDigitalPin(11, PinMode.InputPullup);
            SubscribeDigitalPin(12, PinMode.InputPullup);
            SubscribeDigitalPin(13, PinMode.InputPullup);

            _session.DigitalStateReceived += Session_OnDigitalStateReceived;
            Console.ReadLine();
            _session.Dispose();
            connection.Dispose();
        }

        public void SubscribeDigitalPin(int pin, PinMode mode)
        {
            _session.SetDigitalPinMode(pin, mode);
            _pinModes[pin] = mode;
            var port = pin / 8;
            _session.SetDigitalReportMode(port, true);
        }

        private void Session_OnDigitalStateReceived(object sender, FirmataEventArgs<DigitalPortState> eventArgs)
        {
            var basePin = eventArgs.Value.Port * 8;
            for (var portPin = 0; portPin < 8; portPin++)
            {
                var fullPin = basePin + portPin;
                if (!_pinModes.ContainsKey(fullPin))
                {
                    continue;
                }

                var pinMode = _pinModes[fullPin];
                var pressedValue = pinMode != PinMode.InputPullup;
                var isSet = eventArgs.Value.IsSet(portPin) == pressedValue;
                if (!_pinStates.ContainsKey(fullPin))
                {
                    _pinStates.Add(fullPin, false);
                }
                if (isSet == _pinStates[fullPin]) continue;
                _pinStates[fullPin] = isSet;
                Console.WriteLine($"Port {eventArgs.Value.Port}, Pin {portPin} (Pin #{fullPin}) changed to {isSet}");
            }
        }

        private static ISerialConnection GetConnection()
        {
            Console.WriteLine("Searching Arduino connection...");
            var connection = EnhancedSerialConnection.Find();

            Console.WriteLine(connection == null
                ? "No connection found. Make shure your Arduino board is attached to a USB port."
                : $"Connected to port {connection.PortName} at {connection.BaudRate} baud.");

            return connection;
        }
    }
}
Jeff Hoefs
@soundanalogous
Regarding pull-ups, that's correct. The value is 1 normally and 0 if pressed because the current is pulled up to VCC and when you press the button, it's pulled down to ground. You can find a thorough explanation here: https://learn.sparkfun.com/tutorials/pull-up-resistors.
Rabin Shrestha
@jyapujuju
Hello
I set pinb as input
When i read all six pin as it show me 0
It only work upto 31
Why??
KoToZ
@Mohamedtareque
Hey is there any documentation to start with
Giuseppe Giannotti
@giannottigiuseppe
hi all, it is possible to modify firmata in order to receive a digital input and send a digital output in loop?
Philip Poten
@elpollodiablo
Hey guys, I want to use firmata as a way to control relays with a small python script and without a running daemon
Yet firmata apparently does not like that at all and will always reset when serial is disconnected :(
(not the hardware, but the cli python script)
how do I avoid that?
Alan Yorinks
@MrYsLab
@elpollodiablo I am not sure if I understand your question or what you are trying to do. I do not know if this will solve your issue, but pymata4 which was released yesterday may solve your issue. If you set the "shutdown_on_exception" parameter to False, then a Firmata reset will not be sent to the Arduino unless you explicitly send the reset request. That being said, if you lose the serial link and do not shut down gracefully, then if you have analog input that is streaming data, it will continue to stream, and pymata4 will most likely issue an exception.