diff --git a/documentation/asciidoc/accessories/build-hat.adoc b/documentation/asciidoc/accessories/build-hat.adoc index ca17cd2d0..fcfc20065 100644 --- a/documentation/asciidoc/accessories/build-hat.adoc +++ b/documentation/asciidoc/accessories/build-hat.adoc @@ -1,12 +1,28 @@ +// Intro + include::build-hat/introduction.adoc[] include::build-hat/preparing-build-hat.adoc[] -include::build-hat/installing-software.adoc[] +// Python + +include::build-hat/py-installing-software.adoc[] + +include::build-hat/py-motors.adoc[] + +include::build-hat/py-sensors.adoc[] + +// .NET + +include::build-hat/net-installing-software.adoc[] + +include::build-hat/net-brick.adoc[] + +include::build-hat/net-motors.adoc[] -include::build-hat/motors.adoc[] +include::build-hat/net-sensors.adoc[] -include::build-hat/sensors.adoc[] +// Close out include::build-hat/links-to-other.adoc[] diff --git a/documentation/asciidoc/accessories/build-hat/compat.adoc b/documentation/asciidoc/accessories/build-hat/compat.adoc index 09c061508..70fb160a8 100644 --- a/documentation/asciidoc/accessories/build-hat/compat.adoc +++ b/documentation/asciidoc/accessories/build-hat/compat.adoc @@ -13,19 +13,19 @@ SPIKE Prime Expansion Set | 45678, 45680 | Motor | Active | 31 | Medium Angular Motor | White/Cyan | 45603 | Yes | Yes | 45603 | https://www.bricklink.com/v2/catalog/catalogitem.page?S=45603-1#T=S&O={%22iconly%22:0}[Link] | SPIKE Prime Set | 45678 | Motor | Active | 30 -| Medium Angular Motor | White/Grey | 6299646, 6359216 | Yes | Yes | 436655 | https://www.bricklink.com/v2/catalog/catalogitem.page?P=54696c01&idColor=86#T=C&C=86[Link] | Mindstorms Robot Inventor | 51515 | Motor | Active | 4B +| Medium Angular Motor | White/Grey | 6299646, 6359216, 6386708 | Yes | Yes | 436655 | https://www.bricklink.com/v2/catalog/catalogitem.page?P=54696c01&idColor=86#T=C&C=86[Link] | Mindstorms Robot Inventor | 51515 | Motor | Active | 4B -| Small Angular Motor | White/Cyan | | Yes| Yes| | | SPIKE Essentials Set| | Motor| Active| 41 +| Small Angular Motor | White/Cyan | 45607, 6296520 | Yes| Yes| | https://www.bricklink.com/v2/catalog/catalogitem.page?P=45607c01[Link] | SPIKE Essentials Set| | Motor| Active| 41 | Light/Colour sensor |White/Black | 6217705 |Yes | Yes | | https://www.bricklink.com/v2/catalog/catalogitem.page?P=37308c01&idColor=11#T=C&C=11[Link] | SPIKE Prime Set, SPIKE Prime Expansion Set, Mindstorms Robot Inventor, SPIKE Essentials | 45678, 45680, 51515 | ColorSensor |Active | 3D | Distance Sensor | White/Black | 6302968 | Yes | Yes | | https://www.bricklink.com/v2/catalog/catalogitem.page?P=37316c01&idColor=11#T=C&C=11[Link] | SPIKE Prime Set, Mindstorms Robot Inventor | 45678, 51515 |DistanceSensor | Active | 3E -| System medium motor | White/Grey | 45303,6138854,6290182,6127110 | Yes | Yes | | | Wedo 2.0, LEGO Ideas Piano, App controlled Batmobile | 76112 | | Passive | 1 +| System medium motor | White/Grey | 45303, 6138854, 6290182, 6127110 | Yes | Yes | | | Wedo 2.0, LEGO Ideas Piano, App controlled Batmobile | 76112 | | Passive | 1 | Force Sensor | White/Black | 6254354 | Yes | Yes | 45606 | https://www.bricklink.com/v2/catalog/catalogitem.page?P=37312c01&idColor=11#T=C&C=11[Link] | SPIKE Prime Set | 45678 | ForceSensor | Active | 3F -| 3×3 LED | White/Cyan | | Yes | Yes | | | SPIKE Essentials | | | Active | 40 +| 3×3 LED | White/Cyan | 45608, 6297023 | Yes | Yes | | https://www.bricklink.com/v2/catalog/catalogitem.page?P=45608c01[Link] | SPIKE Essentials | | Matrix | Active | 40 | System train motor | Black | 88011 | Yes | Yes | 28740, 88011-1 | https://www.bricklink.com/v2/catalog/catalogitem.page?S=88011-1#T=S&O={%22iconly%22:0}[Link] | Cargo Train, Disney Train and Station, Passenger Train| | | Passive | 2 @@ -39,8 +39,8 @@ SPIKE Prime Expansion Set | 45678, 45680 | Motor | Active | 31 | Colour + distance sensor | White/Grey | 88007 | Partial | ? | 26912 | https://www.bricklink.com/v2/catalog/catalogitem.page?S=88007-1#T=S&O={%22iconly%22:0}[Link] | | | | Active | 25 -| WeDo 2.0 Motion sensor | White/Grey | 45304 | | | 5003423-1| https://www.bricklink.com/v2/catalog/catalogitem.page?S=9583-1#T=S&O={%22iconly%22:0}}[Link] | | | | Active | 35 +| WeDo 2.0 Motion sensor | White/Grey | 45304, 6138855 | | | 5003423-1| https://www.bricklink.com/v2/catalog/catalogitem.page?S=9583-1#T=S&O={%22iconly%22:0}}[Link] | | | | Active | 35 -| WeDo 2.0 Tilt sensor | White/Grey | 45305 | | | 5003423-1 | https://www.bricklink.com/v2/catalog/catalogitem.page?S=9584-1#T=S&O={%22iconly%22:0}[Link] | | | | Active | 34 +| WeDo 2.0 Tilt sensor | White/Grey | 45305, 6138856 | | | 5003423-1 | https://www.bricklink.com/v2/catalog/catalogitem.page?S=9584-1#T=S&O={%22iconly%22:0}[Link] | | | | Active | 34 |=== diff --git a/documentation/asciidoc/accessories/build-hat/images/3x3matrix.png b/documentation/asciidoc/accessories/build-hat/images/3x3matrix.png new file mode 100644 index 000000000..ce0c1efe4 Binary files /dev/null and b/documentation/asciidoc/accessories/build-hat/images/3x3matrix.png differ diff --git a/documentation/asciidoc/accessories/build-hat/images/active-motor.png b/documentation/asciidoc/accessories/build-hat/images/active-motor.png new file mode 100644 index 000000000..c933668fa Binary files /dev/null and b/documentation/asciidoc/accessories/build-hat/images/active-motor.png differ diff --git a/documentation/asciidoc/accessories/build-hat/images/color-distance.png b/documentation/asciidoc/accessories/build-hat/images/color-distance.png new file mode 100644 index 000000000..653ecb38c Binary files /dev/null and b/documentation/asciidoc/accessories/build-hat/images/color-distance.png differ diff --git a/documentation/asciidoc/accessories/build-hat/images/passive-light.png b/documentation/asciidoc/accessories/build-hat/images/passive-light.png new file mode 100644 index 000000000..632489fd4 Binary files /dev/null and b/documentation/asciidoc/accessories/build-hat/images/passive-light.png differ diff --git a/documentation/asciidoc/accessories/build-hat/images/spike-color.png b/documentation/asciidoc/accessories/build-hat/images/spike-color.png new file mode 100644 index 000000000..5fd808859 Binary files /dev/null and b/documentation/asciidoc/accessories/build-hat/images/spike-color.png differ diff --git a/documentation/asciidoc/accessories/build-hat/images/spike-distance.png b/documentation/asciidoc/accessories/build-hat/images/spike-distance.png new file mode 100644 index 000000000..2cb55a1c4 Binary files /dev/null and b/documentation/asciidoc/accessories/build-hat/images/spike-distance.png differ diff --git a/documentation/asciidoc/accessories/build-hat/images/spike-force.png b/documentation/asciidoc/accessories/build-hat/images/spike-force.png new file mode 100644 index 000000000..06dc942ae Binary files /dev/null and b/documentation/asciidoc/accessories/build-hat/images/spike-force.png differ diff --git a/documentation/asciidoc/accessories/build-hat/images/train-motor.png b/documentation/asciidoc/accessories/build-hat/images/train-motor.png new file mode 100644 index 000000000..00c342aaf Binary files /dev/null and b/documentation/asciidoc/accessories/build-hat/images/train-motor.png differ diff --git a/documentation/asciidoc/accessories/build-hat/images/wedo-distance.png b/documentation/asciidoc/accessories/build-hat/images/wedo-distance.png new file mode 100644 index 000000000..47bc9925e Binary files /dev/null and b/documentation/asciidoc/accessories/build-hat/images/wedo-distance.png differ diff --git a/documentation/asciidoc/accessories/build-hat/images/wedo-tilt.png b/documentation/asciidoc/accessories/build-hat/images/wedo-tilt.png new file mode 100644 index 000000000..153eb43b0 Binary files /dev/null and b/documentation/asciidoc/accessories/build-hat/images/wedo-tilt.png differ diff --git a/documentation/asciidoc/accessories/build-hat/links-to-other.adoc b/documentation/asciidoc/accessories/build-hat/links-to-other.adoc index 6da5c095e..99a7abb35 100644 --- a/documentation/asciidoc/accessories/build-hat/links-to-other.adoc +++ b/documentation/asciidoc/accessories/build-hat/links-to-other.adoc @@ -5,7 +5,7 @@ You can download documentation on the, * https://datasheets.raspberrypi.com/build-hat/build-hat-serial-protocol.pdf[Raspberry Pi Build HAT Serial Protocol] * https://datasheets.raspberrypi.com/build-hat/build-hat-python-library.pdf[Raspberry Pi Build HAT Python Library] -and full details of the Python Library documentation can also be found https://buildhat.readthedocs.io/[on ReadTheDocs]. +and full details of the Python Library documentation can also be found https://buildhat.readthedocs.io/[on ReadTheDocs]. You can find more information on the .NET library in the https://github.com/dotnet/iot/tree/main/src/devices/BuildHat[.NET IoT] Github repository. You can also follow along with projects from the Raspberry Pi Foundation, diff --git a/documentation/asciidoc/accessories/build-hat/net-brick.adoc b/documentation/asciidoc/accessories/build-hat/net-brick.adoc new file mode 100644 index 000000000..54cc2a8f8 --- /dev/null +++ b/documentation/asciidoc/accessories/build-hat/net-brick.adoc @@ -0,0 +1,114 @@ +=== Using the Build HAT from .NET + +The Raspberry Pi Built HAT is refered to "Brick" in LEGO® parlance and you can talk directly to it from .NET using the https://datasheets.raspberrypi.com/build-hat/build-hat-serial-protocol.pdf[Build HAT Serial Protocol]. + +You can create a `brick` object as below, + +[csharp] +---- +Brick brick = new("/dev/serial0"); +---- + +but you need to remember to dispose of the `brick` at the end of your code. + +[csharp] +---- +brick.Dispose(); +---- + +WARNING: If you do not call `brick.Dispose()` you program will not terminate. + +If you want to avoid calling `brick.Dispose` at the end, then create your brick with the `using` statement: + +[csharp] +---- +using Brick brick = new("/dev/serial0"); +---- + +In this case, when reaching the end of the program, your brick will be automatically disposed. + +==== Displaying the information + +You can gather the various software versions, the signature, and the input voltage: + +[csharp] +---- +var info = brick.BuildHatInformation; +Console.WriteLine($"version: {info.Version}, firmware date: {info.FirmwareDate}, signature:"); +Console.WriteLine($"{BitConverter.ToString(info.Signature)}"); +Console.WriteLine($"Vin = {brick.InputVoltage.Volts} V"); +---- + +NOTE: the input voltage is read only once at boot time and is not read again afterwards. + +==== Getting sensors and motors details + +The functions `GetSensorType`, `GetSensor` will allow you to retrieve any information on connected sensor. + +[csharp] +---- +SensorType sensor = brick.GetSensorType((SensorPort)i); +Console.Write($"Port: {i} {(Brick.IsMotor(sensor) ? "Sensor" : "Motor")} type: {sensor} Connected: "); +---- + +In this example, you can as well use the `IsMotor` static function to check if the connected element is a sensor or a motor. + +[csharp] +---- +if (Brick.IsActiveSensor(sensor)) +{ + ActiveSensor activeSensor = brick.GetActiveSensor((SensorPort)i); +} +else +{ + var passive = (Sensor)brick.GetSensor((SensorPort)i); + Console.WriteLine(passive.IsConnected); +} +---- + +`ActiveSensor` have a collection of advanced properties and functions allowing to understand every element of the sensor. It is also possible to call the primitive functions from the brick from them. This will allow you to select specific modes and do advance scenarios. While this is possible, motor and sensor classes have been created to make your life easier. + +==== Events + +Most sensors implements events on their special properties. You can simply subscribe to `PropertyChanged` and `PropertyUpdated`. The changed one will be fired when the value is changing while the updated one when there is a success update to the property. Depending on the modes used, some properties may be updated in the background all the time while some others occasionally. + +You may be interested only when a color is changing or the position of the motor is changing, using it as a tachometer. In this case, the `PropertyChanged` is what you need! + +[csharp] +---- +Console.WriteLine("Move motor on Port A to more than position 100 to stop this test."); +brick.WaitForSensorToConnect(SensorPort.PortA); +var active = (ActiveMotor)brick.GetMotor(SensorPort.PortA); +bool continueToRun = true; +active.PropertyChanged += MotorPropertyEvent; +while (continueToRun) +{ + Thread.Sleep(50); +} + +active.PropertyChanged -= MotorPropertyEvent; +Console.WriteLine($"Current position: {active.Position}, eventing stopped."); + +void MotorPropertyEvent(object? sender, PropertyChangedEventArgs e) +{ + Console.WriteLine($"Property changed: {e.PropertyName}"); + if (e.PropertyName == nameof(ActiveMotor.Position)) + { + if (((ActiveMotor)brick.GetMotor(SensorPort.PortA)).Position > 100) + { + continueToRun = false; + } + } +} +---- + +==== Waiting for initialization + +The brick can take long before it initializes. A wait for sensor to be connected has been implemented, + +[csharp] +---- +brick.WaitForSensorToConnect(SensorPort.PortB); +---- + +It does as well take a `CancellationToken` if you want to implement advance features like warning the user after some time and retrying. \ No newline at end of file diff --git a/documentation/asciidoc/accessories/build-hat/net-installing-software.adoc b/documentation/asciidoc/accessories/build-hat/net-installing-software.adoc new file mode 100644 index 000000000..e9494c0fa --- /dev/null +++ b/documentation/asciidoc/accessories/build-hat/net-installing-software.adoc @@ -0,0 +1,22 @@ +== Using the Build HAT from .NET + +=== Installing the .NET Framework + +The .NET framework from Microsoft is not available via `apt` on Raspberry Pi. However, you can follow the https://docs.microsoft.com/en-us/dotnet/iot/deployment[official instructions] from Microsoft to install the .NET framework. Alternatively, there is a simplified https://www.petecodes.co.uk/install-and-use-microsoft-dot-net-5-with-the-raspberry-pi/[third party route] to get the .NET toolchain on to your Raspberry Pi. + +WARNING: The installation script is run as `root`. You should read it first and make sure you understand what it is doing. If you are at all unsure you should follow the https://docs.microsoft.com/en-us/dotnet/iot/deployment[official instructions] manually. + +[.bash] +---- +$ wget -O - https://raw.githubusercontent.com/pjgpetecodes/dotnet5pi/master/install.sh | sudo bash +---- + +After installing the .NET framework you also need to install the nuget packages: + +[.bash] +---- +$ dotnet add package System.Device.Gpio --source https://pkgs.dev.azure.com/dotnet/IoT/_packaging/nightly_iot_builds/nuget/v3/index.json +$ dotnet add package Iot.Device.Bindings --source https://pkgs.dev.azure.com/dotnet/IoT/_packaging/nightly_iot_builds/nuget/v3/index.json +---- + +You can now create a project and edit it. diff --git a/documentation/asciidoc/accessories/build-hat/net-motors.adoc b/documentation/asciidoc/accessories/build-hat/net-motors.adoc new file mode 100644 index 000000000..0f11ee6ae --- /dev/null +++ b/documentation/asciidoc/accessories/build-hat/net-motors.adoc @@ -0,0 +1,128 @@ +=== Using Motors from .NET + +There are two types of motors, the *passive* ones and the *active* ones. Active motors will provide detailed position, absolute position and speed while passive motors can only be controlled with speed. + +A common set of functions to control the speed of the motors are available. There are 2 important ones: `SetPowerLimit` and `SetBias`: + +[csharp] +---- +train.SetPowerLimit(1.0); +train.SetBias(0.2); +---- + +The accepted values are only from 0.0 to 1.0. The power limit is a convenient ay to reduce in proportion the maximum power. + +The bias value sets for the current port which is added to positive motor drive values and subtracted from negative motor drive values. This can be used to compensate for the fact that most DC motors require a certain amount of drive before they will turn at all. + +The default values when a motor is created is 0.7 for the power limit and 0.3 for the bias. + +==== Passive Motors + +.Train motor, https://www.bricklink.com/v2/catalog/catalogitem.page?S=88011-1&name=Train%20Motor&category=%5BPower%20Functions%5D%5BPowered%20Up%5D#T=S&O={%22iconly%22:0}[Image from Bricklink] +image::images/train-motor.png[Train motor,width="60%"] + +The typical passive motor is a train and older Powered Up motors. The `Speed` property can be set and read. It is the target and the measured speed at the same time as those sensors do not have a way to measure them. The value is from -100 to +100. + +Functions to control `Start`, `Stop` and `SetSpeed` are also available. Here is a example of how to use it: + +[csharp] +---- +Console.WriteLine("This will run the motor for 20 secondes incrementing the PWM"); +train.SetPowerLimit(1.0); +train.Start(); +for (int i = 0; i < 100; i++) +{ + train.SetSpeed(i); + Thread.Sleep(250); +} + +Console.WriteLine("Stop the train for 2 seconds"); +train.Stop(); +Thread.Sleep(2000); +Console.WriteLine("Full speed backward for 2 seconds"); +train.Start(-100); +Thread.Sleep(2000); +Console.WriteLine("Full speed forward for 2 seconds"); +train.Start(100); +Thread.Sleep(2000); +Console.WriteLine("Stop the train"); +train.Stop(); +---- + +NOTE: Once the train is started, you can adjust the speed and the motor will adjust accordingly. + +==== Active Motors + +.Active motor, https://www.bricklink.com/v2/catalog/catalogitem.page?S=88014-1&name=Technic%20XL%20Motor&category=%5BPower%20Functions%5D%5BPowered%20Up%5D#T=S&O={%22iconly%22:0}[Image from Bricklink] +image::images/active-motor.png[Active motor,width="60%"] + +Active motors have `Speed`, `AbsolutePosition`, `Position` and `TargetSpeed` as special properties. They are read continuously even when the motor is stopped. + +The code snippet shows how to get the motors, start them and read the properties: + +[csharp] +---- +brick.WaitForSensorToConnect(SensorPort.PortA); +brick.WaitForSensorToConnect(SensorPort.PortD); +var active = (ActiveMotor)brick.GetMotor(SensorPort.PortA); +var active2 = (ActiveMotor)brick.GetMotor(SensorPort.PortD); +active.Start(50); +active2.Start(50); +// Make sure you have an active motor plug in the port A and D +while (!Console.KeyAvailable) +{ + Console.CursorTop = 1; + Console.CursorLeft = 0; + Console.WriteLine($"Absolute: {active.AbsolutePosition} "); + Console.WriteLine($"Position: {active.Position} "); + Console.WriteLine($"Speed: {active.Speed} "); + Console.WriteLine(); + Console.WriteLine($"Absolute: {active2.AbsolutePosition} "); + Console.WriteLine($"Position: {active2.Position} "); + Console.WriteLine($"Speed: {active2.Speed} "); +} + +active.Stop(); +active2.Stop(); +---- + +NOTE: You should not forget to start and stop your motors when needed. + +Advance features are available for active motors. You can request to move for seconds, to a specific position, a specific absolute position. Here are couple of examples: + +[csharp] +---- +// From the previous example, this will turn the motors back to their initial position: +active.TargetSpeed = 100; +active2.TargetSpeed = 100; +// First this motor and will block the thread +active.MoveToPosition(0, true); +// Then this one and will also block the thread +active2.MoveToPosition(0, true); +---- + +Each function allow you to block or not the thread for the time the operation will be performed. Note that for absolute and relative position moves, there is a tolerance of few degrees. + +[csharp] +---- +brick.WaitForSensorToConnect(SensorPort.PortA); +var active = (ActiveMotor)brick.GetMotor(SensorPort.PortA); +active.TargetSpeed = 70; +Console.WriteLine("Moving motor to position 0"); +active.MoveToPosition(0, true); +Console.WriteLine("Moving motor to position 3600 (10 turns)"); +active.MoveToPosition(3600, true); +Console.WriteLine("Moving motor to position -3600 (so 20 turns the other way"); +active.MoveToPosition(-3600, true); +Console.WriteLine("Moving motor to absolute position 0, should rotate by 90°"); +active.MoveToAbsolutePosition(0, PositionWay.Shortest, true); +Console.WriteLine("Moving motor to position 90"); +active.MoveToAbsolutePosition(90, PositionWay.Shortest, true); +Console.WriteLine("Moving motor to position 179"); +active.MoveToAbsolutePosition(179, PositionWay.Shortest, true); +Console.WriteLine("Moving motor to position -180"); +active.MoveToAbsolutePosition(-180, PositionWay.Shortest, true); +active.Float(); +---- + +You can place the motor in a float position, meaning, there are no more constrains on it. This is a mode that you can use when using the motor as a tachometer, moving it and reading the position. If you still have constrains on the motors, you may not be able to move it. diff --git a/documentation/asciidoc/accessories/build-hat/net-sensors.adoc b/documentation/asciidoc/accessories/build-hat/net-sensors.adoc new file mode 100644 index 000000000..1ecf0c954 --- /dev/null +++ b/documentation/asciidoc/accessories/build-hat/net-sensors.adoc @@ -0,0 +1,213 @@ +=== Using Sensors from .NET + +Like for motors, you have active and passive sensors. Most recent sensors are active. The passive one are lights and simple buttons. Active ones are distance or color sensors, as well as small 3x3 pixel displays. + +==== Button/Touch Passive Sensor + +The button/touch passive sensor have one specific property `IsPressed`. The property is set to true when the button is pressed. Here is a complete example with events: + +[csharp] +---- +brick.WaitForSensorToConnect(SensorPort.PortA); +var button = (ButtonSensor)brick.GetSensor(SensorPort.PortA); +bool continueToRun = true; +button.PropertyChanged += ButtonPropertyEvent; +while (continueToRun) +{ + // You can do many other things here + Thread.Sleep(50); +} + +button.PropertyChanged -= ButtonPropertyEvent; +Console.WriteLine($"Button has been pressed, we're stopping the program."); +brick.Dispose(); + +void ButtonPropertyEvent(object? sender, PropertyChangedEventArgs e) +{ + Console.WriteLine($"Property changed: {e.PropertyName}"); + if (e.PropertyName == nameof(ButtonSensor.IsPressed)) + { + continueToRun = false; + } +} +---- + +==== Passive Light + +.Passive light, https://www.bricklink.com/v2/catalog/catalogitem.page?P=22168c01&name=Electric,%20Light%20Unit%20Powered%20Up%20Attachment&category=%5BElectric,%20Light%20&%20Sound%5D#T=C&C=11[Image from Bricklink] +image::images/passive-light.png[Passive light, width="60%"] + +The passive light are the train lights. They can be switched on and you can controlled their brightness. + +[csharp] +---- +brick.WaitForSensorToConnect(SensorPort.PortA); +var light = (PassiveLight)brick.GetSensor(SensorPort.PortA); +// Brightness 50% +light.On(50); +Thread.Sleep(2000); +// 70% Brightness +light.Brightness = 70; +Thread.Sleep(2000); +// Switch light off +light.Off() +---- + +==== Active Sensor + +The active sensor class is a generic one that all the active sensor heritate including active motors. They contains a set of properties regarding how they are connected to the Build HAT, the modes, the detailed combi modes, the hardware, software versions and a specific property called `ValueAsString`. The value as string contains the last measurement as a collection of strings. A measurement arrives like `P0C0: +23 -42 0`, the enumeration will contains `P0C0:`, `+23`, `-42` and `0`. This is made so if you are using advance modes and managing yourself the combi modes and commands, you'll be able to get the measurements. + +All active sensor can run a specific measurement mode or a combi mode. You can setup one through the advance mode using the `SelectModeAndRead` and `SelectCombiModesAndRead` functions with the specific mode(s) you'd like to continuously have. It is important to understand that changing the mode or setting up a new mode will stop the previous mode. + +The modes that can be combined in the Combi mode are listed in the `CombiModes` property. Al the properties of the sensors will be updated automatically when you'll setup one of those modes. + +==== WeDo Tilt Sensor + +.WeDo Tilt sensor, https://www.bricklink.com/v2/catalog/catalogitem.page?S=45305-1&name=WeDo%202.0%20Tilt%20Sensor&category=%5BEducational%20&%20Dacta%5D%5BWeDo%5D#T=S&O={%22iconly%22:0}[Image from Bricklink] +image::images/wedo-tilt.png[WeDo Tilt sensor, width="60%"] + +WeDo Tilt Sensor has a special `Tilt` property. The type is a point with X is the X tilt and Y is the Y tilt. The values goes from -45 to + 45, they are caped to those values and represent degrees. + +You can set a continuous measurement for this sensor using the `ContinuousMeasurement` property. + +[csharp] +---- +brick.WaitForSensorToConnect(SensorPort.PortA); +var tilt = (WeDoTiltSensor)brick.GetSensor(SensorPort.PortA); +tilt.ContinuousMeasurement = true; +Point tiltValue; +while(!console.KeyAvailable) +{ + tiltValue = tilt.Tilt; + console.WriteLine($"Tilt X: {tiltValue.X}, Tilt Y: {tiltValue.Y}"); + Thread.Sleep(200); +} +---- + +==== WeDoDistance Sensor + +.WeDo Distance sensor, https://www.bricklink.com/v2/catalog/catalogitem.page?S=45304-1&name=WeDo%202.0%20Motion%20Sensor&category=%5BEducational%20&%20Dacta%5D%5BWeDo%5D#T=S&O={%22iconly%22:0}[Image from Bricklink] +image::images/wedo-distance.png[WeDo Distance sensor, width="60%"] + +WeDo Distance Sensor gives you a distance in millimeters with the Distance property. + +[csharp] +---- +brick.WaitForSensorToConnect(SensorPort.PortA); +var distance = (WeDoDistanceSensor)brick.GetSensor(SensorPort.PortA); +distance.ContinuousMeasurement = true; +while(!console.KeyAvailable) +{ + console.WriteLine($"Distance: {distance.Distance} mm"); + Thread.Sleep(200); +} +---- + +==== SPIKE Prime Force Sensor + +.Spike Force Sensor, https://www.bricklink.com/v2/catalog/catalogitem.page?P=37312c01&name=Electric%20Sensor,%20Force%20-%20Spike%20Prime&category=%5BElectric%5D#T=C&C=11[Image from Bricklink] +image::images/spike-force.png[spike force sensor, width="60%"] + +This force sensor measure the pressure applies on it and if it is pressed. The two properties can be access through `Force` and `IsPressed` properties. + +[csharp] +---- +brick.WaitForSensorToConnect(SensorPort.PortA); +var force = (ForceSensor)brick.GetSensor(SensorPort.PortA); +force.ContinuousMeasurement = true; +while(!force.IsPressed) +{ + console.WriteLine($"Force: {force.Force} N"); + Thread.Sleep(200); +} +---- + +==== SPIKE Essential 3x3 Color Light Matrix + +.spike 3x3 matrix, https://www.bricklink.com/v2/catalog/catalogitem.page?P=45608c01&name=Electric,%203%20x%203%20Color%20Light%20Matrix%20-%20SPIKE%20Prime&category=%5BElectric%5D#T=C[Image from Bricklink] +image::images/3x3matrix.png[spike 3x3 matrix, width="60%"] + +This is a small 3x3 display with 9 different leds that can be controlled individually. The class exposes functions to be able to control the screen. Here is an example using them: + +[csharp] +---- +brick.WaitForSensorToConnect(SensorPort.PortA); +var matrix = (ColorLightMatrix)brick.GetSensor(SensorPort.PortA); +for(byte i = 0; i < 10; i++) +{ + // Will light every led one after the other like a progress bar + matrix.DisplayProgressBar(i); + Thread.Sleep(1000); +} + +for(byte i = 0; i < 11; i++) +{ + // Will display the matrix with the same color and go through all of them + matrix.DisplayColor((LedColor)i); + Thread.Sleep(1000); +} + +Span brg = stackalloc byte[9] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; +Span col = stackalloc LedColor[9] { LedColor.White, LedColor.White, LedColor.White, + LedColor.White, LedColor.White, LedColor.White, LedColor.White, LedColor.White, LedColor.White }; +// Shades of grey +matrix.DisplayColorPerPixel(brg, col); +---- + +==== SPIKE Prime Color Sensor and Color and Distance Sensor + +SPIKE color sensor: + +.spike color sensor, https://www.bricklink.com/v2/catalog/catalogitem.page?P=37308c01&name=Electric%20Sensor,%20Color%20-%20Spike%20Prime&category=%5BElectric%5D#T=C&C=11[Image from Bricklink] +image::images/spike-color.png[spike color sensor, width="60%"] + +Color and distance sensor: + +.Color distance sensor, https://www.bricklink.com/v2/catalog/catalogitem.page?P=bb0891c01&name=Electric%20Sensor,%20Color%20and%20Distance%20-%20Boost&category=%5BElectric%5D#T=C&C=1[Image from Bricklink] +image::images/color-distance.png[Color distance sensor, width="60%"] + +Those color sensor has multiple properties and functions. You can get the `Color`, the `ReflectedLight` and the `AmbiantLight`. + +On top of this, the Color and Distance sensor can measure the `Distance` and has an object `Counter`. It will count automatically the number of objects which will go in and out of the range. This does allow to count objects passing in front of the sensor. The distance is limited from 0 to 10 centimeters. + +[csharp] +---- +brick.WaitForSensorToConnect(SensorPort.PortC); + +var colorSensor = (ColorAndDistanceSensor)brick.GetActiveSensor(SensorPort.PortC); +while (!Console.KeyAvailable) +{ + var colorRead = colorSensor.GetColor(); + Console.WriteLine($"Color: {colorRead}"); + var relected = colorSensor.GetReflectedLight(); + Console.WriteLine($"Reflected: {relected}"); + var ambiant = colorSensor.GetAmbiantLight(); + Console.WriteLine($"Ambiant: {ambiant}"); + var distance = colorSensor.GetDistance(); + Console.WriteLine($"Distance: {distance}"); + var counter = colorSensor.GetCounter(); + Console.WriteLine($"Counter: {counter}"); + Thread.Sleep(200); +} +---- + +NOTE: For better measurement, it is not recommended to change the measurement mode in a very fast way, the color integration may not be done in a proper way. This example gives you the full spectrum of what you can do with the sensor. Also, this class do not implement a continuous measurement mode. You can setup one through the advance mode using the `SelectModeAndRead` function with the specific mode you'd like to continuously have. It is important to understand that changing the mode or setting up a new mode will stop the previous mode. + +==== SPIKE Prime Ultrasonic Distance Sensor + +.spike distance sensor, https://www.bricklink.com/v2/catalog/catalogitem.page?P=37316c01&name=Electric%20Sensor,%20Distance%20-%20Spike%20Prime&category=%5BElectric%5D#T=C&C=11[Image from Bricklink] +image::images/spike-distance.png[spike distance sensor, width="60%"] + +This is a distance sensor and it does implement a `Distance` property that will give the distance in millimeter. A `ContinuousMeasurement` mode is also available on this one. + +[csharp] +---- +brick.WaitForSensorToConnect(SensorPort.PortA); +var distance = (UltrasonicDistanceSensor)brick.GetSensor(SensorPort.PortA); +distance.ContinuousMeasurement = true; +while(!console.KeyAvailable) +{ + console.WriteLine($"Distance: {distance.Distance} mm"); + Thread.Sleep(200); +} +---- \ No newline at end of file diff --git a/documentation/asciidoc/accessories/build-hat/preparing-build-hat.adoc b/documentation/asciidoc/accessories/build-hat/preparing-build-hat.adoc index 382982368..f535b5971 100644 --- a/documentation/asciidoc/accessories/build-hat/preparing-build-hat.adoc +++ b/documentation/asciidoc/accessories/build-hat/preparing-build-hat.adoc @@ -75,4 +75,4 @@ image::images/powering-build-hat.gif[width="80%"] The LEGO® Technic™ motors are very powerful; so to drive them you’ll need an external 8V power supply. If you want to read from motor encoders and the SPIKE™ force sensor, you can power your Raspberry Pi and Build HAT the usual way, via your Raspberry Pi’s USB power socket. The SPIKE™ colour and distance sensors, like the motors, require an https://raspberrypi.com/products/build-hat-power-supply[external power supply]. ==== - +You have the choice to use Build HAT with Python or .NET. diff --git a/documentation/asciidoc/accessories/build-hat/installing-software.adoc b/documentation/asciidoc/accessories/build-hat/py-installing-software.adoc similarity index 79% rename from documentation/asciidoc/accessories/build-hat/installing-software.adoc rename to documentation/asciidoc/accessories/build-hat/py-installing-software.adoc index d5baeb264..1aacf9956 100644 --- a/documentation/asciidoc/accessories/build-hat/installing-software.adoc +++ b/documentation/asciidoc/accessories/build-hat/py-installing-software.adoc @@ -1,4 +1,6 @@ -== Installing the Software +== Using the Build HAT from Python + +=== Installing the Python Library Install the Build HAT Python library. Open xref:../computers/using_linux.adoc#terminal[a Terminal window] and type, diff --git a/documentation/asciidoc/accessories/build-hat/motors.adoc b/documentation/asciidoc/accessories/build-hat/py-motors.adoc similarity index 95% rename from documentation/asciidoc/accessories/build-hat/motors.adoc rename to documentation/asciidoc/accessories/build-hat/py-motors.adoc index 77bbf3bdb..20ac73ddf 100644 --- a/documentation/asciidoc/accessories/build-hat/motors.adoc +++ b/documentation/asciidoc/accessories/build-hat/py-motors.adoc @@ -1,15 +1,15 @@ -== Motors +=== Using Motors from Python There are xref:build-hat.adoc#device-compatibility[a number of motors] that work with the Build HAT. -=== Connecting a Motor +==== Connecting a Motor Connect a motor to port A on the Build HAT. The LPF2 connectors need to be inserted the correct way up. If the connector doesn’t slide in easily, rotate by 180 degrees and try again. image::images/connect-motor.gif[width="80%"] -=== Working with Motors +==== Working with Motors Start the https://thonny.org/[Thonny IDE]. Add the program code below: diff --git a/documentation/asciidoc/accessories/build-hat/sensors.adoc b/documentation/asciidoc/accessories/build-hat/py-sensors.adoc similarity index 94% rename from documentation/asciidoc/accessories/build-hat/sensors.adoc rename to documentation/asciidoc/accessories/build-hat/py-sensors.adoc index d8601157f..686521852 100644 --- a/documentation/asciidoc/accessories/build-hat/sensors.adoc +++ b/documentation/asciidoc/accessories/build-hat/py-sensors.adoc @@ -1,8 +1,8 @@ -== Sensors +=== Using Sensors from Python There is a xref:build-hat.adoc#device-compatibility[large range of sensors] that work with the Build HAT. -=== Working with Sensors +==== Working with Sensors Connect a Colour sensor to port B on the Build HAT, and a Force sensor to port C. diff --git a/documentation/asciidoc/accessories/camera/csi-2-usage.adoc b/documentation/asciidoc/accessories/camera/csi-2-usage.adoc index e82330513..3fb0ce0fa 100644 --- a/documentation/asciidoc/accessories/camera/csi-2-usage.adoc +++ b/documentation/asciidoc/accessories/camera/csi-2-usage.adoc @@ -110,7 +110,7 @@ Further guidance can be found in libcamera's https://git.linuxtv.org/libcamera.g ===== Device Tree -Device tree is used to select the sensor driver and configuren parameters such as number of CSI-2 lanes, continuous clock lane operation, and link frequency (often only one is supported). +Device tree is used to select the sensor driver and configure parameters such as number of CSI-2 lanes, continuous clock lane operation, and link frequency (often only one is supported). * The IMX219 https://github.com/raspberrypi/linux/blob/rpi-5.4.y/arch/arm/boot/dts/overlays/imx219-overlay.dts[device tree overlay] for the 5.4 kernel diff --git a/documentation/asciidoc/accessories/camera/libcamera_hello.adoc b/documentation/asciidoc/accessories/camera/libcamera_hello.adoc index 2eabf2438..9c1d93eb1 100644 --- a/documentation/asciidoc/accessories/camera/libcamera_hello.adoc +++ b/documentation/asciidoc/accessories/camera/libcamera_hello.adoc @@ -17,7 +17,7 @@ The preview can be halted either by clicking the window's close button, or using ==== Options -`libcamera-apps` uses a 3rd party library to interpret command line options. This includes _long form_ options where the option name consists of more than one character preceeded by `--`, and _short form_ options which can only be a single character preceded by a single `-`. For the most part option names are chosen to match those used by the legacy `raspicam` applications with the exception that we can no longer handle multi-character option names with a single `-`. Any such legacy options have been dropped and the long form with `--` must be used instead. +`libcamera-apps` uses a 3rd party library to interpret command line options. This includes _long form_ options where the option name consists of more than one character preceded by `--`, and _short form_ options which can only be a single character preceded by a single `-`. For the most part option names are chosen to match those used by the legacy `raspicam` applications with the exception that we can no longer handle multi-character option names with a single `-`. Any such legacy options have been dropped and the long form with `--` must be used instead. The options are classified broadly into 3 groups, namely those that are common, those that are specific to still images, and those that are for video encoding. They are supported in an identical manner across all the applications where they apply. diff --git a/documentation/asciidoc/computers/getting-started.adoc b/documentation/asciidoc/computers/getting-started.adoc index 81f3f3815..d41be93c0 100644 --- a/documentation/asciidoc/computers/getting-started.adoc +++ b/documentation/asciidoc/computers/getting-started.adoc @@ -13,4 +13,3 @@ include::getting-started/installing-from-windows.adoc[] include::getting-started/sd-cards.adoc[] include::getting-started/connecting-a-monitor.adoc[] - diff --git a/documentation/asciidoc/computers/getting-started/sd-cards.adoc b/documentation/asciidoc/computers/getting-started/sd-cards.adoc index 14270a9cf..4a74f7010 100644 --- a/documentation/asciidoc/computers/getting-started/sd-cards.adoc +++ b/documentation/asciidoc/computers/getting-started/sd-cards.adoc @@ -3,7 +3,7 @@ Raspberry Pi computers use a micro SD card, except for very early models which use a full-sized SD card. -WARNING: Because of a hardware limitation in the Raspberry Pi Zero, 1 and 2, the boot partition on the SD card must be 256GB or less otherwise the device will not boot up. Later models of Raspberry Pi 2 — with a BCM2837 SoC — along with the Raspberry Pi 3, 4, Zero 2, and the Raspberry Pi 400 do not have this limitation. This does not affect Raspberry Pi OS, which always uses a small boot partition. +WARNING: Because of a hardware limitation in the Raspberry Pi Zero, 1 and 2, the boot partition on the SD card must be 256GB or less otherwise the device will not boot up. Later models of Raspberry Pi 2 — with a BCM2837 SoC — along with the Raspberry Pi 3, 4, Zero 2 W, and the Raspberry Pi 400 do not have this limitation. This does not affect Raspberry Pi OS, which always uses a small boot partition. === Recommended Capacity diff --git a/documentation/asciidoc/computers/linux_kernel/building.adoc b/documentation/asciidoc/computers/linux_kernel/building.adoc index be52204d3..f02c51caf 100644 --- a/documentation/asciidoc/computers/linux_kernel/building.adoc +++ b/documentation/asciidoc/computers/linux_kernel/building.adoc @@ -62,7 +62,7 @@ KERNEL=kernel make bcmrpi_defconfig ---- -For Raspberry PI Zero 2 W, Pi 2, Pi 3, Pi 3+, and Compute Module 3 default build configuration +For Raspberry Pi Zero 2 W, Pi 2, Pi 3, Pi 3+, and Compute Module 3 default build configuration [,bash] ---- diff --git a/documentation/asciidoc/computers/raspberry-pi/boot-msd.adoc b/documentation/asciidoc/computers/raspberry-pi/boot-msd.adoc index 70020b631..238701864 100644 --- a/documentation/asciidoc/computers/raspberry-pi/boot-msd.adoc +++ b/documentation/asciidoc/computers/raspberry-pi/boot-msd.adoc @@ -1,6 +1,6 @@ == USB Mass Storage Boot -NOTE: Available on Raspberry Pi 2B v1.2, 3A+, 3B, 3B+, 4B, 400, Raspberry Pi Zero 2, Compute Module 3, Compute Module 3+ and Compute Module 4 only. +NOTE: Available on Raspberry Pi 2B v1.2, 3A+, 3B, 3B+, 4B, 400, Raspberry Pi Zero 2 W, Compute Module 3, Compute Module 3+ and Compute Module 4 only. This page explains how to boot your Raspberry Pi from a USB mass storage device such as a flash drive or a USB hard disk. When attaching USB devices, particularly hard disks and SSDs, be mindful of their power requirements. If you wish to attach more than one SSD or hard disk to the Pi, this normally requires external power - either a powered hard disk enclosure, or a powered USB hub. Note that models prior to the Pi 4B have known issues which prevent booting with some USB devices. @@ -24,9 +24,9 @@ Please see the xref:compute-module.adoc#flashing-the-compute-module-emmc[Flashin The Raspberry Pi 3B+ supports USB mass storage boot out of the box. -=== Raspberry Pi 2B, 3A+, 3B, CM 3, 3+, Zero 2 +=== Raspberry Pi 2B, 3A+, 3B, CM 3, 3+, Zero 2 W -On the Raspberry Pi 2B v1.2, 3A+, 3B, Zero 2, and Compute Module 3, 3+ you must first enable xref:raspberry-pi.adoc#usb-host-boot-mode[USB host boot mode]. This is to allow USB mass storage boot, and xref:raspberry-pi.adoc#network-booting[network boot]. Note that network boot is not supported on the Raspberry Pi 3A+. +On the Raspberry Pi 2B v1.2, 3A+, 3B, Zero 2 W, and Compute Module 3, 3+ you must first enable xref:raspberry-pi.adoc#usb-host-boot-mode[USB host boot mode]. This is to allow USB mass storage boot, and xref:raspberry-pi.adoc#network-booting[network boot]. Note that network boot is not supported on the Raspberry Pi 3A+ or Zero 2 W. To enable USB host boot mode, the Raspberry Pi needs to be booted from an SD card with a special option to set the USB host boot mode bit in the one-time programmable (OTP) memory. Once this bit has been set, the SD card is no longer required. diff --git a/documentation/asciidoc/computers/raspberry-pi/raspberry-pi-schematics.adoc b/documentation/asciidoc/computers/raspberry-pi/raspberry-pi-schematics.adoc index 20e6ada7f..0fd2543dd 100644 --- a/documentation/asciidoc/computers/raspberry-pi/raspberry-pi-schematics.adoc +++ b/documentation/asciidoc/computers/raspberry-pi/raspberry-pi-schematics.adoc @@ -64,7 +64,7 @@ NOTE: Mechanical drawings for the Raspberry Pi 3, Model A+ are also applicable t ==== Test Pad Locations -The Raspberry Pi Zero 2 has a number of test pad locations used during production of the board. +The Raspberry Pi Zero 2 W has a number of test pad locations used during production of the board. image::images/zero2-pad-diagram.png[width="70%"]