From ae81ec76a67fef299844aa06c7682e21681f7825 Mon Sep 17 00:00:00 2001 From: Enzo Ribas Date: Sat, 2 Aug 2025 14:35:30 -0300 Subject: [PATCH 01/10] Add hardware guides for Arduino, ESP32, and Raspberry Pi Introduced comprehensive documentation for Arduino Uno, ESP32 (including ESP32-CAM), and Raspberry Pi. Added introductory guides, programming instructions, basic code examples, and hardware overviews for each platform to support new users and streamline onboarding. --- .../Arduino/arduinoUno/.keep | 0 .../arduinoUno/basicExemples.md/examples.md | 85 ++++++++++++ .../Arduino/arduinoUno/overview.md | 35 +++++ .../Arduino/howToProgram.md | 44 ++++++ .../Arduino/intro.md | 21 +++ .../ESP32/ESP32CAM/conections.md | 49 +++++++ .../ESP32/ESP32CAM/overview.md | 30 +++++ .../ESP32/ESP32CAM/tutorials/tutorials.md | 127 ++++++++++++++++++ .../ESP32/basicExemples.md/.keep | 0 .../ESP32/basicExemples.md/examples.md | 82 +++++++++++ .../ESP32/howToProgram.md | 56 ++++++++ .../MicroControllers_Computers/ESP32/intro.md | 22 +++ .../RaspberryPi/arduinoUno/.keep | 0 .../RaspberryPi/arduinoUno/overview.md | 0 .../RaspberryPi/howToProgram.md | 66 +++++++++ .../RaspberryPi/intro.md | 27 ++++ 16 files changed, 644 insertions(+) create mode 100644 3D/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/.keep create mode 100644 3D/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/basicExemples.md/examples.md create mode 100644 3D/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/overview.md create mode 100644 3D/hardware_guide/MicroControllers_Computers/Arduino/howToProgram.md create mode 100644 3D/hardware_guide/MicroControllers_Computers/Arduino/intro.md create mode 100644 3D/hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/conections.md create mode 100644 3D/hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/overview.md create mode 100644 3D/hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/tutorials/tutorials.md create mode 100644 3D/hardware_guide/MicroControllers_Computers/ESP32/basicExemples.md/.keep create mode 100644 3D/hardware_guide/MicroControllers_Computers/ESP32/basicExemples.md/examples.md create mode 100644 3D/hardware_guide/MicroControllers_Computers/ESP32/howToProgram.md create mode 100644 3D/hardware_guide/MicroControllers_Computers/ESP32/intro.md create mode 100644 3D/hardware_guide/MicroControllers_Computers/RaspberryPi/arduinoUno/.keep create mode 100644 3D/hardware_guide/MicroControllers_Computers/RaspberryPi/arduinoUno/overview.md create mode 100644 3D/hardware_guide/MicroControllers_Computers/RaspberryPi/howToProgram.md create mode 100644 3D/hardware_guide/MicroControllers_Computers/RaspberryPi/intro.md diff --git a/3D/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/.keep b/3D/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/.keep new file mode 100644 index 0000000..e69de29 diff --git a/3D/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/basicExemples.md/examples.md b/3D/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/basicExemples.md/examples.md new file mode 100644 index 0000000..0d6b682 --- /dev/null +++ b/3D/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/basicExemples.md/examples.md @@ -0,0 +1,85 @@ + +# Arduino Uno Basic Examples + +Here are some basic examples to get you started with the Arduino Uno. + +## 1. Blink + +This is the "Hello, World!" of microcontrollers. It blinks the built-in LED on the Arduino board. + +```cpp +void setup() { + pinMode(LED_BUILTIN, OUTPUT); +} + +void loop() { + digitalWrite(LED_BUILTIN, HIGH); + delay(1000); + digitalWrite(LED_BUILTIN, LOW); + delay(1000); +} +``` + +## 2. Fading an LED + +This example shows how to fade an LED on and off using one of the PWM pins. + +```cpp +int led = 9; +int brightness = 0; +int fadeAmount = 5; + +void setup() { + pinMode(led, OUTPUT); +} + +void loop() { + analogWrite(led, brightness); + brightness = brightness + fadeAmount; + if (brightness <= 0 || brightness >= 255) { + fadeAmount = -fadeAmount; + } + delay(30); +} +``` + +## 3. Reading a Sensor + +This example shows how to read the value from an analog sensor, such as a potentiometer or a photoresistor. + +```cpp +void setup() { + Serial.begin(9600); +} + +void loop() { + int sensorValue = analogRead(A0); + Serial.println(sensorValue); + delay(1); +} +``` + +## 4. Button + +This example shows how to read a pushbutton press. + +```cpp +const int buttonPin = 2; +const int ledPin = 13; + +int buttonState = 0; + +void setup() { + pinMode(ledPin, OUTPUT); + pinMode(buttonPin, INPUT); +} + +void loop() { + buttonState = digitalRead(buttonPin); + if (buttonState == HIGH) { + digitalWrite(ledPin, HIGH); + } else { + digitalWrite(ledPin, LOW); + } +} +``` diff --git a/3D/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/overview.md b/3D/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/overview.md new file mode 100644 index 0000000..16406d3 --- /dev/null +++ b/3D/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/overview.md @@ -0,0 +1,35 @@ + +# Arduino Uno Overview + +The Arduino Uno is the most popular and widely used board in the Arduino family. It's a great choice for beginners and experienced users alike. + +## Key Features + +- **Microcontroller:** ATmega328P +- **Operating Voltage:** 5V +- **Input Voltage (recommended):** 7-12V +- **Digital I/O Pins:** 14 (of which 6 provide PWM output) +- **Analog Input Pins:** 6 +- **DC Current per I/O Pin:** 20 mA +- **Flash Memory:** 32 KB +- **SRAM:** 2 KB +- **EEPROM:** 1 KB +- **Clock Speed:** 16 MHz + +## Pinout + +![Arduino Uno Pinout](https://content.arduino.cc/assets/Pinout-Unorev3_latest.png) + +## Power + +The Arduino Uno can be powered via the USB connection or with an external power supply. The power source is selected automatically. + +External (non-USB) power can come either from an AC-to-DC adapter (wall-wart) or a battery. The adapter can be connected by plugging a 2.1mm center-positive plug into the board's power jack. Leads from a battery can be inserted in the Gnd and Vin pin headers of the POWER connector. + +## Communication + +The Arduino Uno has a number of facilities for communicating with a computer, another Arduino, or other microcontrollers. + +- **Serial:** The ATmega328P provides UART TTL (5V) serial communication, which is available on digital pins 0 (RX) and 1 (TX). +- **I2C:** The board has a dedicated I2C bus, which is available on pins A4 (SDA) and A5 (SCL). +- **SPI:** The board has a dedicated SPI bus, which is available on pins 10 (SS), 11 (MOSI), 12 (MISO), and 13 (SCK). diff --git a/3D/hardware_guide/MicroControllers_Computers/Arduino/howToProgram.md b/3D/hardware_guide/MicroControllers_Computers/Arduino/howToProgram.md new file mode 100644 index 0000000..535a762 --- /dev/null +++ b/3D/hardware_guide/MicroControllers_Computers/Arduino/howToProgram.md @@ -0,0 +1,44 @@ + +# How to Program an Arduino + +Programming an Arduino is done using the Arduino IDE (Integrated Development Environment), a free software that runs on your computer. + +## 1. Download and Install the Arduino IDE + +- Go to the official Arduino website: [https://www.arduino.cc/en/software](https://www.arduino.cc/en/software) +- Download the version of the IDE that is compatible with your operating system (Windows, macOS, or Linux). +- Follow the installation instructions. + +## 2. Connect the Arduino to Your Computer + +- Use a USB cable to connect your Arduino board to your computer. +- The green power LED on the board should light up. + +## 3. Configure the Arduino IDE + +- **Select your board:** Go to `Tools > Board` and select the type of Arduino board you are using (e.g., "Arduino Uno"). +- **Select the port:** Go to `Tools > Port` and select the serial port that your Arduino is connected to. This will usually be a COM port on Windows or a `/dev/tty.usbmodem` port on macOS. + +## 4. Write Your First Sketch (Program) + +An Arduino program is called a "sketch." Here is a simple example that blinks the built-in LED on the board: + +```cpp +void setup() { + // initialize digital pin LED_BUILTIN as an output. + pinMode(LED_BUILTIN, OUTPUT); +} + +void loop() { + digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level) + delay(1000); // wait for a second + digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW + delay(1000); // wait for a second +} +``` + +## 5. Upload the Sketch to the Arduino + +- Click the "Upload" button (the right-arrow icon) in the Arduino IDE. +- The IDE will compile the sketch and upload it to your Arduino board. +- You should see the built-in LED on your board start to blink. diff --git a/3D/hardware_guide/MicroControllers_Computers/Arduino/intro.md b/3D/hardware_guide/MicroControllers_Computers/Arduino/intro.md new file mode 100644 index 0000000..6832538 --- /dev/null +++ b/3D/hardware_guide/MicroControllers_Computers/Arduino/intro.md @@ -0,0 +1,21 @@ + +# Introduction to Arduino + +Arduino is an open-source electronics platform based on easy-to-use hardware and software. It's intended for anyone making interactive projects. + +## What is Arduino? + +An Arduino board is a microcontroller, which is a small computer that can be programmed to control electronic devices. It's designed to be simple and accessible, so that even beginners can get started with electronics and programming. + +## Why Use Arduino? + +- **Simplicity:** The Arduino IDE (Integrated Development Environment) is easy to use and the programming language is a simplified version of C++. +- **Cost-effective:** Arduino boards are relatively inexpensive. +- **Large Community:** There is a large online community of Arduino users who share code, tutorials, and solutions to common problems. +- **Extensible:** Arduino boards can be extended with "shields," which are add-on boards that provide additional functionality (e.g., motor control, GPS, Ethernet). + +## Common Arduino Boards + +- **Arduino Uno:** The most popular and well-documented board, great for beginners. +- **Arduino Nano:** A smaller version of the Uno, ideal for projects with limited space. +- **Arduino Mega:** A larger board with more pins and memory, suitable for more complex projects. diff --git a/3D/hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/conections.md b/3D/hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/conections.md new file mode 100644 index 0000000..7feaaeb --- /dev/null +++ b/3D/hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/conections.md @@ -0,0 +1,49 @@ + +# ESP32-CAM Connections + +Connecting the ESP32-CAM to other components and programming it requires a few specific connections. + +## Programming Connections (using an FTDI Programmer) + +To upload code to the ESP32-CAM, you need an FTDI (Future Technology Devices International) programmer, which is a USB-to-serial converter. + +Here are the necessary connections: + +| ESP32-CAM Pin | FTDI Programmer Pin | +| :---: | :---: | +| 5V | VCC (5V) | +| GND | GND | +| U0TXD | RXD | +| U0RXD | TXD | + +**Crucial Step for Uploading:** Before you can upload a sketch, you must connect the `GPIO 0` pin to `GND`. This action puts the ESP32-CAM into flashing mode. + +### Uploading Procedure: + +1. Make the connections listed in the table above. +2. Connect `GPIO 0` to `GND`. +3. Connect the FTDI programmer to your computer via USB. +4. Open your programming environment (e.g., Arduino IDE). +5. Select the correct board (`AI Thinker ESP32-CAM`) and COM port. +6. Press the "Upload" button. +7. Once the upload is complete, **disconnect `GPIO 0` from `GND`**. +8. Press the onboard reset (RST) button to start running your new program. + +## Powering the ESP32-CAM + +While you can power the board through the FTDI programmer during development, for standalone projects, it's highly recommended to use a dedicated 5V power supply. + +- **Using the 5V Pin:** Connect a stable 5V power source to the `5V` and `GND` pins. The power supply should be able to provide at least 2A, especially when the camera and Wi-Fi are active, to prevent brownouts and instability. + +## MicroSD Card Connections + +The ESP32-CAM has a built-in MicroSD card slot. The connections are internal, so you just need to insert a formatted MicroSD card (up to 4GB is officially supported, but larger cards may work). + +The following GPIO pins are used by the MicroSD card reader: + +- **GPIO 14:** CLK +- **GPIO 15:** CMD +- **GPIO 2:** Data0 +- **GPIO 4:** Data1 (also used for the onboard flash LED) +- **GPIO 12:** Data2 +- **GPIO 13:** Data3 diff --git a/3D/hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/overview.md b/3D/hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/overview.md new file mode 100644 index 0000000..1e3c273 --- /dev/null +++ b/3D/hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/overview.md @@ -0,0 +1,30 @@ + +# ESP32-CAM Overview + +The ESP32-CAM is a small, low-cost development board that combines an ESP32-S microcontroller with a 2-megapixel OV2640 camera. It's an excellent choice for projects that require video streaming, image capture, or computer vision. + +## Key Features + +- **Microcontroller:** ESP32-S +- **Camera:** OV2640 (2MP) +- **Flash Memory:** 4MB +- **RAM:** 520KB SRAM + 4MB PSRAM +- **Wi-Fi:** 802.11 b/g/n +- **Bluetooth:** v4.2 BR/EDR and BLE +- **GPIO:** 9 available GPIO pins +- **Storage:** MicroSD card slot (up to 4GB) +- **Power:** 5V input + +## Pinout + +![ESP32-CAM Pinout](https://i0.wp.com/randomnerdtutorials.com/wp-content/uploads/2019/03/esp32-cam-pinout-ai-thinker.png?w=712&quality=100&strip=all&ssl=1) + +## Getting Started + +To use the ESP32-CAM, you'll need an FTDI programmer to upload code. The board does not have a built-in USB-to-serial converter. + +**Important:** Before uploading code, you must connect the `GPIO 0` pin to `GND`. This puts the board into flashing mode. After the code is uploaded, disconnect `GPIO 0` from `GND` and press the reset button to run the new sketch. + +## Powering the ESP32-CAM + +The board can be powered through the 5V pin. It's recommended to use an external 5V power supply that can provide at least 2A, especially when using the camera, as it can be power-hungry. diff --git a/3D/hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/tutorials/tutorials.md b/3D/hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/tutorials/tutorials.md new file mode 100644 index 0000000..75d1dc2 --- /dev/null +++ b/3D/hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/tutorials/tutorials.md @@ -0,0 +1,127 @@ + + +# ESP32-CAM Tutorials + +Here are some tutorials to help you get started with the ESP32-CAM. + +## 1. Camera Web Server + +This is the most popular ESP32-CAM project. It hosts a web page on your local network that streams video from the camera. + +### Arduino IDE Setup + +1. **Board:** In the Arduino IDE, go to `Tools > Board` and select "AI Thinker ESP32-CAM". +2. **Example Sketch:** Go to `File > Examples > ESP32 > Camera` and open the `CameraWebServer` example. + +### Code Configuration + +In the `CameraWebServer` sketch, you need to make a few changes: + +1. **Select Camera Model:** Uncomment the line for the AI-Thinker model: + ```cpp + #define CAMERA_MODEL_AI_THINKER + ``` +2. **Enter Wi-Fi Credentials:** Find the following lines and replace `ssid` and `password` with your Wi-Fi network's name and password: + ```cpp + const char* ssid = "YOUR_SSID"; + const char* password = "YOUR_PASSWORD"; + ``` + +### Upload and Run + +1. Follow the programming connections and procedure outlined in the `conections.md` file (connect `GPIO 0` to `GND`). +2. Upload the sketch. +3. Disconnect `GPIO 0` from `GND` and press the reset button. +4. Open the Serial Monitor and set the baud rate to `115200`. +5. The ESP32-CAM will connect to your Wi-Fi and print its IP address in the Serial Monitor. +6. Open a web browser on a device connected to the same Wi-Fi network and enter the IP address. +7. You should see a web page with a video stream from your camera! + +## 2. Taking a Photo and Saving to MicroSD Card + +This project shows you how to capture an image and save it as a `.jpg` file on a MicroSD card. + +### Arduino IDE Setup + +1. Make sure you have the ESP32 board support installed. +2. Insert a formatted MicroSD card into the ESP32-CAM's card slot. + +### Example Code + +This code initializes the camera and the SD card, takes a picture, and saves it. You can then trigger this action with a button press or another sensor. + +```cpp +#include "esp_camera.h" +#include "FS.h" +#include "SD_MMC.h" + +// Pin definition for CAMERA_MODEL_AI_THINKER +#define PWDN_GPIO_NUM 32 +#define RESET_GPIO_NUM -1 +#define XCLK_GPIO_NUM 0 +#define SIOD_GPIO_NUM 26 +#define SIOC_GPIO_NUM 27 +#define Y9_GPIO_NUM 35 +#define Y8_GPIO_NUM 34 +#define Y7_GPIO_NUM 39 +#define Y6_GPIO_NUM 36 +#define Y5_GPIO_NUM 21 +#define Y4_GPIO_NUM 19 +#define Y3_GPIO_NUM 18 +#define Y2_GPIO_NUM 5 +#define VSYNC_GPIO_NUM 25 +#define HREF_GPIO_NUM 23 +#define PCLK_GPIO_NUM 22 + +void setup() { + Serial.begin(115200); + Serial.setDebugOutput(true); + Serial.println(); + + camera_config_t config; + // ... (camera configuration - see full example online) ... + + // initialize the camera + esp_err_t err = esp_camera_init(&config); + if (err != ESP_OK) { + Serial.printf("Camera init failed with error 0x%x", err); + return; + } + + if(!SD_MMC.begin()){ + Serial.println("Card Mount Failed"); + return; + } + uint8_t cardType = SD_MMC.cardType(); + if(cardType == CARD_NONE){ + Serial.println("No SD card attached"); + return; + } + + // Take a picture + camera_fb_t * fb = esp_camera_fb_get(); + if(!fb) { + Serial.println("Camera capture failed"); + return; + } + + // Save picture to microSD card + fs::FS &fs = SD_MMC; + String path = "/picture.jpg"; + File file = fs.open(path.c_str(), FILE_WRITE); + if(!file){ + Serial.println("Failed to open file in writing mode"); + } else { + file.write(fb->buf, fb->len); // payload (image), payload length + Serial.printf("Saved file to path: %s\n", path.c_str()); + } + file.close(); + esp_camera_fb_return(fb); +} + +void loop() { + // Code in setup runs once +} +``` +*Note: This is a simplified version. For the full, working code, please refer to online tutorials from resources like Random Nerd Tutorials.* + diff --git a/3D/hardware_guide/MicroControllers_Computers/ESP32/basicExemples.md/.keep b/3D/hardware_guide/MicroControllers_Computers/ESP32/basicExemples.md/.keep new file mode 100644 index 0000000..e69de29 diff --git a/3D/hardware_guide/MicroControllers_Computers/ESP32/basicExemples.md/examples.md b/3D/hardware_guide/MicroControllers_Computers/ESP32/basicExemples.md/examples.md new file mode 100644 index 0000000..cef7129 --- /dev/null +++ b/3D/hardware_guide/MicroControllers_Computers/ESP32/basicExemples.md/examples.md @@ -0,0 +1,82 @@ + +# ESP32 Basic Examples + +Here are some basic examples to get you started with the ESP32. + +## 1. Wi-Fi Scan + +This example shows how to scan for available Wi-Fi networks. + +```cpp +#include "WiFi.h" + +void setup() { + Serial.begin(115200); + + // Set WiFi to station mode and disconnect from an AP if it was previously connected + WiFi.mode(WIFI_STA); + WiFi.disconnect(); + delay(100); + + Serial.println("Setup done"); +} + +void loop() { + Serial.println("Scan start"); + + // WiFi.scanNetworks will return the number of networks found + int n = WiFi.scanNetworks(); + Serial.println("Scan done"); + if (n == 0) { + Serial.println("no networks found"); + } else { + Serial.print(n); + Serial.println(" networks found"); + for (int i = 0; i < n; ++i) { + // Print SSID and RSSI for each network found + Serial.print(i + 1); + Serial.print(": "); + Serial.print(WiFi.SSID(i)); + Serial.print(" ("); + Serial.print(WiFi.RSSI(i)); + Serial.print(")"); + Serial.println((WiFi.encryptionType(i) == WIFI_AUTH_OPEN) ? " " : "*"); + delay(10); + } + } + Serial.println(""); + + // Wait a bit before scanning again + delay(5000); +} +``` + +## 2. Bluetooth Serial + +This example shows how to use Bluetooth to send and receive data. + +```cpp +#include "BluetoothSerial.h" + +#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED) +#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it +#endif + +BluetoothSerial SerialBT; + +void setup() { + Serial.begin(115200); + SerialBT.begin("ESP32test"); //Bluetooth device name + Serial.println("The device started, now you can pair it with bluetooth!"); +} + +void loop() { + if (Serial.available()) { + SerialBT.write(Serial.read()); + } + if (SerialBT.available()) { + Serial.write(SerialBT.read()); + } + delay(20); +} +``` diff --git a/3D/hardware_guide/MicroControllers_Computers/ESP32/howToProgram.md b/3D/hardware_guide/MicroControllers_Computers/ESP32/howToProgram.md new file mode 100644 index 0000000..14ff658 --- /dev/null +++ b/3D/hardware_guide/MicroControllers_Computers/ESP32/howToProgram.md @@ -0,0 +1,56 @@ + +# How to Program an ESP32 + +Programming the ESP32 is similar to programming an Arduino. You can use the Arduino IDE with an extension, or you can use other development environments like PlatformIO or the official Espressif IDF (IoT Development Framework). + +## Using the Arduino IDE + +This is the most common method for beginners. + +### 1. Install the Arduino IDE + +If you haven't already, download and install the Arduino IDE from the [official website](https://www.arduino.cc/en/software). + +### 2. Add ESP32 Board Support to Arduino IDE + +- Open the Arduino IDE. +- Go to `File > Preferences`. +- In the "Additional Board Manager URLs" field, enter the following URL: + ``` + https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json + ``` +- Click "OK". +- Go to `Tools > Board > Boards Manager...`. +- Search for "esp32" and install the "esp32 by Espressif Systems" package. + +### 3. Configure the IDE for Your ESP32 Board + +- Connect your ESP32 board to your computer with a USB cable. +- Go to `Tools > Board` and select your specific ESP32 board (e.g., "ESP32 Dev Module"). +- Go to `Tools > Port` and select the correct serial port. + +### 4. Write and Upload a Sketch + +Now you can write code just like you would for an Arduino. Here's a "Hello, World!" example for the ESP32, which prints to the Serial Monitor. + +```cpp +void setup() { + Serial.begin(115200); +} + +void loop() { + Serial.println("Hello from ESP32!"); + delay(1000); +} +``` + +- Click the "Upload" button to flash the code onto your ESP32. +- Open the Serial Monitor (`Tools > Serial Monitor`) and set the baud rate to 115200 to see the output. + +## Using PlatformIO + +PlatformIO is a more advanced, cross-platform build system that integrates with code editors like VS Code. It offers better library management and is preferred for larger projects. + +- **Installation:** Install Visual Studio Code and then install the PlatformIO IDE extension from the marketplace. +- **Project Setup:** Create a new PlatformIO project and select your ESP32 board. +- **Programming:** Write your code in the `src/main.cpp` file and use the PlatformIO interface to build and upload. diff --git a/3D/hardware_guide/MicroControllers_Computers/ESP32/intro.md b/3D/hardware_guide/MicroControllers_Computers/ESP32/intro.md new file mode 100644 index 0000000..50e695b --- /dev/null +++ b/3D/hardware_guide/MicroControllers_Computers/ESP32/intro.md @@ -0,0 +1,22 @@ + +# Introduction to ESP32 + +The ESP32 is a series of low-cost, low-power system on a chip microcontrollers with integrated Wi-Fi and dual-mode Bluetooth. It is the successor to the ESP8266 and is developed by Espressif Systems. + +## What is an ESP32? + +The ESP32 is a powerful microcontroller that is well-suited for a wide range of applications, including IoT (Internet of Things), home automation, and robotics. It has a number of features that make it a popular choice for hobbyists and professionals alike. + +## Why Use ESP32? + +- **Wi-Fi and Bluetooth:** The ESP32 has built-in Wi-Fi and Bluetooth, which makes it easy to connect to the internet and other devices. +- **Dual-Core Processor:** The ESP32 has a dual-core processor, which allows it to perform multiple tasks at the same time. +- **Low Power Consumption:** The ESP32 is designed to be low-power, which makes it ideal for battery-powered applications. +- **Cost-effective:** ESP32 boards are very affordable. +- **Large Community:** There is a large and active community of ESP32 users who provide support and share projects. + +## Common ESP32 Boards + +- **ESP32-WROOM-32:** A popular and versatile module that can be found on many development boards. +- **ESP32-CAM:** A small board with a built-in camera, ideal for video streaming and image processing projects. +- **ESP32-S3:** A newer version of the ESP32 with more features, including a more powerful processor and more memory. diff --git a/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/arduinoUno/.keep b/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/arduinoUno/.keep new file mode 100644 index 0000000..e69de29 diff --git a/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/arduinoUno/overview.md b/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/arduinoUno/overview.md new file mode 100644 index 0000000..e69de29 diff --git a/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/howToProgram.md b/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/howToProgram.md new file mode 100644 index 0000000..9220c7b --- /dev/null +++ b/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/howToProgram.md @@ -0,0 +1,66 @@ + +# How to Program a Raspberry Pi + +Programming a Raspberry Pi is different from programming a microcontroller. Since the Raspberry Pi is a full computer running an operating system (like Raspberry Pi OS), you write and run code directly on the device itself. + +## 1. Setting Up Your Raspberry Pi + +First, you need to get your Raspberry Pi running. + +- **Install Raspberry Pi OS:** Download the Raspberry Pi Imager from the [official website](https://www.raspberrypi.com/software/) and use it to flash the Raspberry Pi OS onto a microSD card. +- **Initial Boot:** Insert the microSD card into your Pi, connect a monitor, keyboard, mouse, and power supply, and turn it on. +- **Complete Setup:** Follow the on-screen instructions to set up your location, password, and connect to Wi-Fi. + +## 2. Accessing Your Raspberry Pi + +You have two main ways to work with your Raspberry Pi: + +- **Desktop Environment:** Use it like a regular computer with the connected monitor, keyboard, and mouse. +- **Headless (Remote Access):** Access your Pi from another computer over the network using SSH (for a command-line interface) or VNC (for the full graphical desktop). This is very common for robotics and embedded projects. + +To enable SSH and VNC, open the Raspberry Pi Configuration tool (`Menu > Preferences > Raspberry Pi Configuration > Interfaces`) and enable them. + +## 3. Programming Languages + +Python is the most popular and officially recommended language for programming on the Raspberry Pi. Raspberry Pi OS comes with Python and several useful libraries pre-installed. + +### Writing and Running a Python Script + +1. **Open a Code Editor:** You can use the pre-installed **Thonny IDE**, which is excellent for beginners, or any other text editor like VS Code (which can be installed on the Pi). +2. **Write Your Code:** Create a new file and write your Python code. For example, a simple "Hello, World!" script named `hello.py`: + ```python + print("Hello from the Raspberry Pi!") + ``` +3. **Save the File:** Save the script in your home directory or a project folder. +4. **Run from the Terminal:** + - Open the **Terminal** application. + - Navigate to the directory where you saved your file using the `cd` command (e.g., `cd my_project`). + - Run the script using the python interpreter: + ```bash + python hello.py + ``` + +## 4. Controlling GPIO Pins + +The real power for physical computing comes from the GPIO (General-Purpose Input/Output) pins. You can use Python libraries to control them. + +- **gpiozero:** A modern, beginner-friendly library for controlling GPIO devices. +- **RPi.GPIO:** The classic, more traditional library for GPIO control. + +### Example: Blinking an LED with `gpiozero` + +1. **Connect the Hardware:** Connect an LED to GPIO pin 17 and a ground pin on the Raspberry Pi (don't forget a resistor!). +2. **Write the Python Script:** + ```python + from gpiozero import LED + from time import sleep + + led = LED(17) + + while True: + led.on() + sleep(1) + led.off() + sleep(1) + ``` +3. **Run the Script:** Save the code and run it from the terminal (`python blink.py`). The LED should start blinking. diff --git a/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/intro.md b/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/intro.md new file mode 100644 index 0000000..9c6c384 --- /dev/null +++ b/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/intro.md @@ -0,0 +1,27 @@ + +# Introduction to Raspberry Pi + +The Raspberry Pi is a low-cost, credit-card-sized computer that plugs into a computer monitor or TV, and uses a standard keyboard and mouse. It is a capable little device that enables people of all ages to explore computing, and to learn how to program in languages like Scratch and Python. + +## What is a Raspberry Pi? + +Unlike a microcontroller like an Arduino or ESP32, a Raspberry Pi is a full-fledged single-board computer (SBC). This means it runs a complete operating system (typically a version of Linux called Raspberry Pi OS) and can do most things a desktop computer can do, like browsing the internet, playing videos, and running software. + +## Why Use a Raspberry Pi? + +- **Versatility:** It can be used as a desktop computer, a web server, a home automation hub, a retro gaming console, a robot brain, and much more. +- **Linux Operating System:** Running a full OS gives you immense power and flexibility. You can install a vast range of open-source software and tools. +- **Processing Power:** Modern Raspberry Pi models have multi-core processors and significant RAM, making them suitable for more computationally intensive tasks than microcontrollers. +- **Connectivity:** They come with USB ports, Ethernet, Wi-Fi, Bluetooth, and HDMI, making it easy to connect peripherals. +- **GPIO Pins:** Like microcontrollers, the Raspberry Pi has a row of General-Purpose Input/Output (GPIO) pins that allow it to control electronic components like LEDs, motors, and sensors. + +## Common Raspberry Pi Models + +- **Raspberry Pi 4 Model B:** A powerful and popular model with different RAM options (2GB, 4GB, 8GB), dual-monitor support, and USB 3.0 ports. +- **Raspberry Pi Zero 2 W:** A tiny, low-cost Pi with wireless connectivity, ideal for small, embedded projects. +- **Raspberry Pi Pico:** This is an exception! The Pico is a **microcontroller**, not a single-board computer. It's designed by the Raspberry Pi Foundation to compete with Arduino and is programmed in C/C++ or MicroPython. + +## Raspberry Pi vs. Arduino/ESP32 + +- **Choose a Raspberry Pi when:** You need a full operating system, networking, significant processing power, or want to run complex applications (e.g., a web server, machine learning inference, a media center). +- **Choose an Arduino/ESP32 when:** You need to perform simple, repetitive tasks with low power consumption, read sensors, and control motors in a very reliable and real-time manner. From c17615dc9ccf253112d8c166fa5b6b2a4d637cfc Mon Sep 17 00:00:00 2001 From: Enzo Ribas Date: Sat, 2 Aug 2025 14:51:55 -0300 Subject: [PATCH 02/10] Add hardware guide docs for components and Raspberry Pi Added overview documentation for buttons, LEDs, motors, potentiometers, and resistors in the Components section. Introduced Raspberry Pi 4 Model B documentation, including basic Python GPIO examples, and added an overview for Raspberry Pi Zero 2 W. These additions expand the hardware guide with foundational reference material for common electronic components and Raspberry Pi boards. --- .../Components/Buttons/overview.md | 62 ++++++++++ 3D/hardware_guide/Components/LEDs/overview.md | 62 ++++++++++ .../Components/Motors/overview.md | 40 +++++++ .../Components/Potentiometers/overview.md | 67 +++++++++++ .../Components/Resistors/overview.md | 60 ++++++++++ .../basicExemples.md/examples.md | 110 ++++++++++++++++++ .../Raspberry Pi 4 Model B/overview.md | 33 ++++++ .../.keep | 0 .../overview.md | 0 9 files changed, 434 insertions(+) create mode 100644 3D/hardware_guide/Components/Buttons/overview.md create mode 100644 3D/hardware_guide/Components/LEDs/overview.md create mode 100644 3D/hardware_guide/Components/Motors/overview.md create mode 100644 3D/hardware_guide/Components/Potentiometers/overview.md create mode 100644 3D/hardware_guide/Components/Resistors/overview.md create mode 100644 3D/hardware_guide/MicroControllers_Computers/RaspberryPi/Raspberry Pi 4 Model B/basicExemples.md/examples.md create mode 100644 3D/hardware_guide/MicroControllers_Computers/RaspberryPi/Raspberry Pi 4 Model B/overview.md rename 3D/hardware_guide/MicroControllers_Computers/RaspberryPi/{arduinoUno => Raspberry Pi Zero 2 W}/.keep (100%) rename 3D/hardware_guide/MicroControllers_Computers/RaspberryPi/{arduinoUno => Raspberry Pi Zero 2 W}/overview.md (100%) diff --git a/3D/hardware_guide/Components/Buttons/overview.md b/3D/hardware_guide/Components/Buttons/overview.md new file mode 100644 index 0000000..c74f8f9 --- /dev/null +++ b/3D/hardware_guide/Components/Buttons/overview.md @@ -0,0 +1,62 @@ + +# Buttons and Switches + +A button or switch is a simple component that controls the flow of current in a circuit by opening or closing the connection. + +## How They Work + +- **Normally Open (NO):** This is the most common type of push button. The circuit is disconnected (open) by default. When you press the button, it completes the circuit (closes it), allowing current to flow. +- **Normally Closed (NC):** The circuit is connected (closed) by default. When you press the button, it breaks the circuit (opens it), stopping the current flow. + +## The Problem of Floating Pins + +When you connect a button to a microcontroller's input pin, you need to know its state: is it pressed or not pressed? This corresponds to a digital HIGH or LOW. + +If you just connect a button to an input pin and VCC (e.g., 5V), the pin will be HIGH when pressed. But what about when it's not pressed? The input pin is not connected to anything, which is called a **floating state**. In this state, the pin can randomly read HIGH or LOW due to electrical noise, leading to unreliable behavior. + +To fix this, we must use **pull-up** or **pull-down** resistors. + +## Pull-up and Pull-down Resistors + +These resistors ensure the input pin is always in a known, stable state. + +### 1. Pull-down Resistor + +- **How it works:** A resistor (typically 10kΩ) is connected from the input pin to Ground (GND). +- **Behavior:** + - When the button is **not pressed**, the resistor "pulls" the input pin's voltage down to GND. The pin reads **LOW**. + - When the button **is pressed**, it connects the input pin directly to VCC (5V), overriding the resistor. The pin reads **HIGH**. + +![Pull-down Resistor Diagram](https://www.upesy.com/wp-content/uploads/2021/09/pull-down-resistor-schematic.png) + +### 2. Pull-up Resistor + +- **How it works:** A resistor (typically 10kΩ) is connected from the input pin to VCC (5V). +- **Behavior:** + - When the button is **not pressed**, the resistor "pulls" the input pin's voltage up to VCC. The pin reads **HIGH**. + - When the button **is pressed**, it connects the input pin directly to GND, overriding the resistor. The pin reads **LOW**. + +![Pull-up Resistor Diagram](https://www.upesy.com/wp-content/uploads/2021/09/pull-up-resistor-schematic.png) + +**Note:** The logic is inverted with a pull-up resistor (pressed = LOW). + +## Internal Pull-ups + +Most microcontrollers (including Arduino and Raspberry Pi) have **internal pull-up resistors** that you can enable in your code. This is extremely convenient as it means you don't need to add an external resistor to your circuit. + +**Arduino Example:** +```cpp +// Enables the internal pull-up resistor on pin 2 +pinMode(2, INPUT_PULLUP); +``` + +When using `INPUT_PULLUP`, you simply wire the button between the input pin and GND. The pin will be HIGH when not pressed and LOW when pressed. + +## Debouncing + +When you press a mechanical button, the metal contacts can bounce against each other for a few milliseconds before settling. A microcontroller is fast enough to read these bounces as multiple, separate presses. + +**Debouncing** is the technique used to handle this, ensuring only one press is registered. + +- **Software Debouncing:** The most common method. After detecting a press, you can add a small delay (e.g., 50ms) in your code and then read the button state again to make sure it's still pressed. +- **Hardware Debouncing:** Can be done by adding a small capacitor to the circuit. diff --git a/3D/hardware_guide/Components/LEDs/overview.md b/3D/hardware_guide/Components/LEDs/overview.md new file mode 100644 index 0000000..f825137 --- /dev/null +++ b/3D/hardware_guide/Components/LEDs/overview.md @@ -0,0 +1,62 @@ + +# LEDs (Light Emitting Diodes) + +An LED is a semiconductor light source that emits light when current flows through it. They are one of the most common components in electronics, used for everything from simple indicators to lighting. + +## How an LED Works + +- **Diode:** An LED is a type of diode, which means it only allows current to flow in one direction. +- **Polarity:** Because it's a diode, an LED has polarity. It has a positive lead (**anode**) and a negative lead (**cathode**). +- **Anode (Positive):** This is typically the longer leg. +- **Cathode (Negative):** This is typically the shorter leg. The flat edge on the side of the LED also indicates the cathode. + +If you connect an LED backwards, it will not light up and can be damaged. + +![LED Polarity Diagram](https://www.build-electronic-circuits.com/wp-content/uploads/2013/08/led-polarity.png) + +## Why You MUST Use a Resistor with an LED + +An LED has very little internal resistance. If you connect it directly to a voltage source (like a 5V pin on an Arduino), a very large amount of current will flow through it, instantly destroying the LED. This is called thermal runaway. + +To prevent this, you **must** always use a **current-limiting resistor** in series with the LED. + +### How to Calculate the Resistor Value + +You can use Ohm's Law (V = I * R) to find the right resistor value. + +**R = (Vs - Vf) / I** + +- **R:** The resistance you need (in Ohms). +- **Vs:** The voltage of your power source (e.g., 5V for an Arduino). +- **Vf:** The LED's forward voltage. This is the amount of voltage the LED "drops" when it's on. It varies by color (see chart below). +- **I:** The desired current for the LED (in Amperes). A safe and common value for most 5mm LEDs is 20mA, which is **0.020A**. + +### Typical LED Forward Voltages (Vf) + +| Color | Forward Voltage (approx.) | +| :--- | :---: | +| Red | 1.8V - 2.2V | +| Green | 2.0V - 2.4V | +| Blue | 3.0V - 3.4V | +| White | 3.0V - 3.4V | +| Yellow | 2.0V - 2.2V | + +**Example Calculation (Red LED with 5V source):** + +- Vs = 5V +- Vf = 2.0V (average for a red LED) +- I = 0.020A (20mA) + +R = (5V - 2.0V) / 0.020A + +R = 3V / 0.020A + +R = 150 Ω + +The closest standard resistor value is 220Ω, which is a perfect choice as it provides a little extra protection. + +## Types of LEDs + +- **Through-Hole:** The standard LEDs with two legs, common in breadboarding. +- **Surface Mount (SMD):** Tiny LEDs that are soldered directly onto a circuit board. +- **RGB LEDs:** These combine three separate LEDs (Red, Green, and Blue) in a single package. By controlling the brightness of each color, you can create any color in the spectrum. diff --git a/3D/hardware_guide/Components/Motors/overview.md b/3D/hardware_guide/Components/Motors/overview.md new file mode 100644 index 0000000..e7a2024 --- /dev/null +++ b/3D/hardware_guide/Components/Motors/overview.md @@ -0,0 +1,40 @@ + +# Motors in Electronics + +Motors are essential components in robotics and many electronic projects. They convert electrical energy into mechanical motion. + +## Types of Motors + +There are many different types of motors, each with its own characteristics and best use cases. + +### 1. DC Motors + +- **What they are:** The most common type of motor. They have two terminals, and when you apply a DC voltage, the shaft spins. +- **Control:** The speed is controlled by varying the voltage. The direction is changed by reversing the polarity of the voltage. +- **Use Cases:** Fans, toys, robot wheels. +- **Note:** They are not precise. You can control the speed and direction, but not the exact position of the shaft. + +### 2. Servo Motors + +- **What they are:** A DC motor combined with a position feedback sensor (usually a potentiometer) and a small controller circuit. This allows for precise control of the shaft's angular position. +- **Control:** They are controlled by sending a series of pulses (Pulse Width Modulation, or PWM). The width of the pulse determines the angle of the shaft (e.g., 1ms pulse for 0 degrees, 2ms for 180 degrees). +- **Use Cases:** Robotic arms, steering systems in RC cars, pan-tilt camera mounts. + +### 3. Stepper Motors + +- **What they are:** These motors rotate in discrete steps. The shaft moves a specific number of degrees per step (e.g., 1.8 degrees per step). +- **Control:** They are controlled by energizing internal coils in a specific sequence. This requires a dedicated stepper motor driver (like an A4988 or DRV8825). +- **Use Cases:** 3D printers, CNC machines, scanners, and any application requiring precise, repeatable positioning. + +### 4. Brushless Motors + +- **What they are:** A more advanced type of motor that uses electronic commutation instead of mechanical brushes. This makes them more efficient, durable, and quieter. +- **Control:** Requires a dedicated Electronic Speed Controller (ESC) to operate. +- **Use Cases:** Drones, electric vehicles, high-performance RC cars. + +## Motor Drivers + +A microcontroller (like an Arduino or Raspberry Pi) cannot power a motor directly because motors require more current than the microcontroller's GPIO pins can supply. You **must** use a motor driver. + +- **What it does:** A motor driver is an intermediate circuit that takes a low-current control signal from the microcontroller and delivers a higher-current signal to the motor. +- **Common Examples:** L298N (for DC and stepper motors), A4988 (for stepper motors), DRV8825 (for stepper motors), ESCs (for brushless motors). diff --git a/3D/hardware_guide/Components/Potentiometers/overview.md b/3D/hardware_guide/Components/Potentiometers/overview.md new file mode 100644 index 0000000..e9bde02 --- /dev/null +++ b/3D/hardware_guide/Components/Potentiometers/overview.md @@ -0,0 +1,67 @@ + +# Potentiometers + +A potentiometer is a three-terminal variable resistor. It acts as a voltage divider and is commonly used to provide a variable analog signal to a microcontroller, for example, to control volume, brightness, or the position of a servo motor. + +## How a Potentiometer Works + +Inside a potentiometer, there is a resistive track and a sliding contact, or **wiper**. As you turn the knob, the wiper moves along the track. + +It has three pins: + +1. **Pin 1 (CCW - Counter-Clockwise):** One end of the resistive track. +2. **Pin 2 (Wiper):** The middle pin, connected to the sliding contact. +3. **Pin 3 (CW - Clockwise):** The other end of the resistive track. + +![Potentiometer Diagram](https://www.build-electronic-circuits.com/wp-content/uploads/2013/09/potentiometer-schematic-symbol-and-breadboard-layout.png) + +## Using a Potentiometer as a Voltage Divider + +This is the most common way to use a potentiometer with a microcontroller. + +1. **Connect the outer pins to power:** + - Connect Pin 1 to Ground (GND). + - Connect Pin 3 to your voltage source (e.g., 5V or 3.3V). + +2. **Connect the center pin to an analog input:** + - Connect Pin 2 (the wiper) to an analog input pin on your microcontroller (e.g., A0 on an Arduino). + +### What Happens? + +- When the knob is turned all the way to the GND side (Pin 1), the wiper is close to GND, and the voltage on the analog pin will be close to 0V. The microcontroller will read a value close to 0. +- When the knob is turned all the way to the VCC side (Pin 3), the wiper is close to VCC, and the voltage on the analog pin will be close to 5V. The microcontroller will read its maximum analog value (e.g., 1023 for a 10-bit ADC on an Arduino). +- At any position in between, the wiper picks up a voltage that is proportional to its position along the resistive track, providing a smooth range of analog values. + +## Reading the Value + +You use the `analogRead()` function on a microcontroller to read the voltage from the wiper pin. + +**Arduino Example:** + +```cpp +// Connect the potentiometer's center pin to A0 +int potPin = A0; + +void setup() { + Serial.begin(9600); +} + +void loop() { + // Read the analog value (from 0 to 1023) + int potValue = analogRead(potPin); + + // Print the value to the Serial Monitor + Serial.println(potValue); + + delay(100); // Wait a bit before the next reading +} +``` + +## Types of Potentiometers + +- **Linear Taper:** The resistance changes linearly as you turn the knob. If you turn the knob 50% of the way, the resistance is 50% of the total. These are used for most sensor control applications. +- **Logarithmic (Audio) Taper:** The resistance changes logarithmically. This is used for audio applications (like volume controls) because human hearing is also logarithmic. + +## Using a Potentiometer as a Rheostat + +A potentiometer can also be used as a simple two-terminal variable resistor (called a rheostat). You do this by using only the wiper (Pin 2) and one of the outer pins (Pin 1 or 3). In this configuration, it can be used to control the current in a circuit, for example, to vary the brightness of an LED. diff --git a/3D/hardware_guide/Components/Resistors/overview.md b/3D/hardware_guide/Components/Resistors/overview.md new file mode 100644 index 0000000..c8c5a4f --- /dev/null +++ b/3D/hardware_guide/Components/Resistors/overview.md @@ -0,0 +1,60 @@ + +# Resistors + +A resistor is a fundamental passive electronic component that creates resistance in the flow of electric current. Its purpose is to limit current, divide voltage, and in some cases, generate heat. + +## What Does a Resistor Do? + +Imagine electricity flowing through a wire is like water flowing through a pipe. A resistor is like a narrow section of that pipe, which restricts the flow. + +Key functions: + +- **Current Limiting:** This is the most common use. For example, an LED (Light Emitting Diode) can be destroyed if too much current flows through it. A resistor is placed in series with the LED to limit the current to a safe level. +- **Voltage Division:** Two or more resistors can be used to create a voltage divider, which produces a lower, stable voltage from a higher voltage source. This is very useful for providing a specific reference voltage to a component or reading sensors. +- **Pull-up and Pull-down:** In digital logic, resistors are used to ensure that a pin is in a known state (either HIGH or LOW) when it would otherwise be "floating," such as when a button is not being pressed. + +## Units of Resistance + +The unit of electrical resistance is the **Ohm (Ω)**. + +You will commonly see values in: + +- **Ohms (Ω)** +- **Kilo-ohms (kΩ):** 1 kΩ = 1,000 Ω +- **Mega-ohms (MΩ):** 1 MΩ = 1,000,000 Ω + +## How to Read a Resistor (Color Codes) + +Through-hole resistors are too small to have their value printed on them. Instead, they use a system of colored bands. + +![Resistor Color Code Chart](https://www.build-electronic-circuits.com/wp-content/uploads/2011/11/4-band-resistor-color-code-chart.png) + +### 4-Band Resistors: + +- **Band 1:** First digit of the resistance value. +- **Band 2:** Second digit of the resistance value. +- **Band 3:** Multiplier (the number of zeros to add). +- **Band 4:** Tolerance (how accurate the resistor's value is). Gold is ±5%, Silver is ±10%. + +**Example:** + +A resistor has the colors: **Brown, Black, Red, Gold** + +1. **Brown:** 1 +2. **Black:** 0 +3. **Red:** x 100 (or add two zeros) +4. **Gold:** ±5% tolerance + +So, the value is **10** followed by **two zeros** = **1000 Ω** or **1 kΩ**, with a ±5% tolerance. + +## Ohm's Law + +The relationship between voltage (V), current (I), and resistance (R) is defined by Ohm's Law: + +**V = I * R** + +- **V:** Voltage (in Volts) +- **I:** Current (in Amperes) +- **R:** Resistance (in Ohms) + +This is the most important formula in basic electronics. You can use it to calculate the correct resistor value needed for a specific application, like protecting an LED. diff --git a/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/Raspberry Pi 4 Model B/basicExemples.md/examples.md b/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/Raspberry Pi 4 Model B/basicExemples.md/examples.md new file mode 100644 index 0000000..6b589b9 --- /dev/null +++ b/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/Raspberry Pi 4 Model B/basicExemples.md/examples.md @@ -0,0 +1,110 @@ + +# Raspberry Pi Basic Examples (Python) + +These examples use the `gpiozero` library, which is a friendly and intuitive way to interact with the GPIO pins on a Raspberry Pi. + +## 1. Blinking an LED + +This is the fundamental "Hello, World!" of physical computing. + +**Hardware:** +- 1 x LED +- 1 x 330Ω Resistor +- Connect the longer leg (anode) of the LED to GPIO pin 17. +- Connect the shorter leg (cathode) to the resistor, and the other end of the resistor to a Ground (GND) pin. + +**Code (`blink.py`):** +```python +from gpiozero import LED +from time import sleep + +# Initialize the LED on GPIO pin 17 +led = LED(17) + +print("LED will blink. Press Ctrl+C to exit.") + +try: + while True: + led.on() # Turn the LED on + sleep(1) # Wait for 1 second + led.off() # Turn the LED off + sleep(1) # Wait for 1 second +except KeyboardInterrupt: + print("\nExiting program.") + led.off() # Ensure LED is off when program exits +``` + +**To Run:** +```bash +python blink.py +``` + +## 2. Reading a Button Press + +This example shows how to get digital input from a push button. + +**Hardware:** +- 1 x Push Button +- Connect one leg of the button to GPIO pin 2. +- Connect the other leg to a Ground (GND) pin. + +**Code (`button_test.py`):** +```python +from gpiozero import Button +from time import sleep + +# Initialize the Button on GPIO pin 2 +# The internal pull-up resistor is enabled by default +button = Button(2) + +print("Press the button. Press Ctrl+C to exit.") + +try: + while True: + if button.is_pressed: + print("Button is pressed") + else: + print("Button is not pressed") + sleep(0.1) +except KeyboardInterrupt: + print("\nExiting program.") +``` + +**To Run:** +```bash +python button_test.py +``` + +## 3. Button-Controlled LED + +This combines the previous two examples. + +**Hardware:** +- Same as the LED and Button examples above. + +**Code (`button_led.py`):** +```python +from gpiozero import LED, Button +from signal import pause + +led = LED(17) +button = Button(2) + +print("Press the button to turn the LED on/off. Press Ctrl+C to exit.") + +# The following lines link the button's state to the LED's state +# button.when_pressed = led.on +# button.when_released = led.off + +# A more direct way to do the same thing: +led.source = button.values + +# pause() keeps the script running until you exit with Ctrl+C +pause() +``` + +**To Run:** +```bash +python button_led.py +``` + diff --git a/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/Raspberry Pi 4 Model B/overview.md b/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/Raspberry Pi 4 Model B/overview.md new file mode 100644 index 0000000..92dd710 --- /dev/null +++ b/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/Raspberry Pi 4 Model B/overview.md @@ -0,0 +1,33 @@ + +# Raspberry Pi 4 Model B Overview + +The Raspberry Pi 4 Model B is a significant upgrade from its predecessors, offering desktop performance in a tiny, affordable package. It's the most powerful and versatile board in the Raspberry Pi lineup, making it ideal for a huge range of projects, from home servers to complex robotics. + +## Key Features + +- **Processor:** Broadcom BCM2711, Quad core Cortex-A72 (ARM v8) 64-bit SoC @ 1.5GHz (can be overclocked). +- **RAM:** Available in 1GB, 2GB, 4GB, or 8GB LPDDR4-3200 SDRAM options. +- **Connectivity:** + - 2.4 GHz and 5.0 GHz IEEE 802.11ac wireless LAN, Bluetooth 5.0, BLE. + - Gigabit Ethernet. + - 2 × USB 3.0 ports; 2 × USB 2.0 ports. +- **Video & Sound:** + - 2 × micro-HDMI ports (supports up to 4kp60). + - 4-pole stereo audio and composite video port. +- **GPIO:** Standard 40-pin GPIO header (fully backwards compatible with previous boards). +- **Storage:** MicroSD card slot for loading operating system and data storage. +- **Power:** 5V DC via USB-C connector (minimum 3A recommended). + +## Pinout + +The Raspberry Pi 4 maintains the same standard 40-pin GPIO header as previous models, ensuring compatibility with most existing HATs and add-on boards. + +![Raspberry Pi 4 Pinout](https://www.raspberrypi.com/documentation/computers/images/GPIO-Pinout-Diagram-2.png) + +## Key Differences from Previous Models + +- **CPU Performance:** A major leap in processing power. +- **RAM Options:** The first Pi to offer up to 8GB of RAM, making it a true desktop replacement. +- **Dual Monitor Support:** Two micro-HDMI ports allow for a dual-screen setup. +- **USB 3.0:** Faster data transfer with two USB 3.0 ports. +- **Power Connector:** Moved to USB-C to support the higher power requirements. diff --git a/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/arduinoUno/.keep b/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/Raspberry Pi Zero 2 W/.keep similarity index 100% rename from 3D/hardware_guide/MicroControllers_Computers/RaspberryPi/arduinoUno/.keep rename to 3D/hardware_guide/MicroControllers_Computers/RaspberryPi/Raspberry Pi Zero 2 W/.keep diff --git a/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/arduinoUno/overview.md b/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/Raspberry Pi Zero 2 W/overview.md similarity index 100% rename from 3D/hardware_guide/MicroControllers_Computers/RaspberryPi/arduinoUno/overview.md rename to 3D/hardware_guide/MicroControllers_Computers/RaspberryPi/Raspberry Pi Zero 2 W/overview.md From b63fed02c5fa82593b2e8f73a6ffca7f07ba7c51 Mon Sep 17 00:00:00 2001 From: Enzo Ribas Date: Sat, 2 Aug 2025 17:07:03 -0300 Subject: [PATCH 03/10] Add hardware tutorials and guides for components and boards Added new tutorial markdown files for various hardware components (Buttons, LEDs, Motors, Potentiometers, Resistors, Sensors) and microcontroller/computer boards (Arduino Uno, ESP32, Raspberry Pi 4, Raspberry Pi Zero 2 W). Included detailed example projects and code for Arduino, ESP32, and Raspberry Pi platforms. Removed old Raspberry Pi Zero 2 W overview and .keep files, replacing them with updated overview and tutorial content. --- .../Components/Buttons/tutorials.md | 1 + .../Components/LEDs/tutorials.md | 1 + .../Components/Motors/tutorials.md | 1 + .../Components/Potentiometers/tutorials.md | 1 + .../Components/Resistors/tutorials.md | 1 + .../Components/Sensors/tutorials.md | 1 + .../arduinoUno/basicExemples.md/tutorials.md | 97 +++++++++++ .../Arduino/arduinoUno/tutorials.md | 1 + .../ESP32/ESP32CAM/tutorials.md | 3 + .../ESP32/ESP32S3/tutorials.md | 1 + .../ESP32/basicExemples.md/tutorials.md | 159 ++++++++++++++++++ .../ESP32/tutorials/tutorials.md | 3 + .../Raspberry Pi 4 Model B/tutorials.md | 1 + .../RaspberryPi/Raspberry Pi Zero 2 W/.keep | 0 .../Raspberry Pi Zero 2 W/overview.md | 0 .../basicExemples.md/tutorials.md | 129 ++++++++++++++ .../RaspberryPi/raspberryPiZero2W/overview.md | 41 +++++ .../raspberryPiZero2W/tutorials.md | 112 ++++++++++++ 18 files changed, 553 insertions(+) create mode 100644 3D/hardware_guide/Components/Buttons/tutorials.md create mode 100644 3D/hardware_guide/Components/LEDs/tutorials.md create mode 100644 3D/hardware_guide/Components/Motors/tutorials.md create mode 100644 3D/hardware_guide/Components/Potentiometers/tutorials.md create mode 100644 3D/hardware_guide/Components/Resistors/tutorials.md create mode 100644 3D/hardware_guide/Components/Sensors/tutorials.md create mode 100644 3D/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/basicExemples.md/tutorials.md create mode 100644 3D/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/tutorials.md create mode 100644 3D/hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/tutorials.md create mode 100644 3D/hardware_guide/MicroControllers_Computers/ESP32/ESP32S3/tutorials.md create mode 100644 3D/hardware_guide/MicroControllers_Computers/ESP32/basicExemples.md/tutorials.md create mode 100644 3D/hardware_guide/MicroControllers_Computers/ESP32/tutorials/tutorials.md create mode 100644 3D/hardware_guide/MicroControllers_Computers/RaspberryPi/Raspberry Pi 4 Model B/tutorials.md delete mode 100644 3D/hardware_guide/MicroControllers_Computers/RaspberryPi/Raspberry Pi Zero 2 W/.keep delete mode 100644 3D/hardware_guide/MicroControllers_Computers/RaspberryPi/Raspberry Pi Zero 2 W/overview.md create mode 100644 3D/hardware_guide/MicroControllers_Computers/RaspberryPi/raspberryPi4/basicExemples.md/tutorials.md create mode 100644 3D/hardware_guide/MicroControllers_Computers/RaspberryPi/raspberryPiZero2W/overview.md create mode 100644 3D/hardware_guide/MicroControllers_Computers/RaspberryPi/raspberryPiZero2W/tutorials.md diff --git a/3D/hardware_guide/Components/Buttons/tutorials.md b/3D/hardware_guide/Components/Buttons/tutorials.md new file mode 100644 index 0000000..8c66150 --- /dev/null +++ b/3D/hardware_guide/Components/Buttons/tutorials.md @@ -0,0 +1 @@ +https://www.youtube.com/watch?v=RiYnucfy_rs \ No newline at end of file diff --git a/3D/hardware_guide/Components/LEDs/tutorials.md b/3D/hardware_guide/Components/LEDs/tutorials.md new file mode 100644 index 0000000..8c66150 --- /dev/null +++ b/3D/hardware_guide/Components/LEDs/tutorials.md @@ -0,0 +1 @@ +https://www.youtube.com/watch?v=RiYnucfy_rs \ No newline at end of file diff --git a/3D/hardware_guide/Components/Motors/tutorials.md b/3D/hardware_guide/Components/Motors/tutorials.md new file mode 100644 index 0000000..8c66150 --- /dev/null +++ b/3D/hardware_guide/Components/Motors/tutorials.md @@ -0,0 +1 @@ +https://www.youtube.com/watch?v=RiYnucfy_rs \ No newline at end of file diff --git a/3D/hardware_guide/Components/Potentiometers/tutorials.md b/3D/hardware_guide/Components/Potentiometers/tutorials.md new file mode 100644 index 0000000..8c66150 --- /dev/null +++ b/3D/hardware_guide/Components/Potentiometers/tutorials.md @@ -0,0 +1 @@ +https://www.youtube.com/watch?v=RiYnucfy_rs \ No newline at end of file diff --git a/3D/hardware_guide/Components/Resistors/tutorials.md b/3D/hardware_guide/Components/Resistors/tutorials.md new file mode 100644 index 0000000..8c66150 --- /dev/null +++ b/3D/hardware_guide/Components/Resistors/tutorials.md @@ -0,0 +1 @@ +https://www.youtube.com/watch?v=RiYnucfy_rs \ No newline at end of file diff --git a/3D/hardware_guide/Components/Sensors/tutorials.md b/3D/hardware_guide/Components/Sensors/tutorials.md new file mode 100644 index 0000000..8c66150 --- /dev/null +++ b/3D/hardware_guide/Components/Sensors/tutorials.md @@ -0,0 +1 @@ +https://www.youtube.com/watch?v=RiYnucfy_rs \ No newline at end of file diff --git a/3D/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/basicExemples.md/tutorials.md b/3D/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/basicExemples.md/tutorials.md new file mode 100644 index 0000000..e7f655c --- /dev/null +++ b/3D/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/basicExemples.md/tutorials.md @@ -0,0 +1,97 @@ + +# Arduino Uno Tutorials + +These tutorials guide you through common beginner projects with the Arduino Uno. + +## Tutorial 1: Controlling an LED with a Potentiometer + +This project uses a potentiometer to control the brightness of an LED. + +**Hardware Needed:** +- 1 x Arduino Uno +- 1 x Breadboard +- 1 x LED +- 1 x 220Ω Resistor +- 1 x 10kΩ Potentiometer +- Jumper Wires + +**Circuit:** +1. Connect the LED to the breadboard. Connect its longer leg (anode) to the 220Ω resistor. +2. Connect the other end of the resistor to Arduino pin 9. +3. Connect the LED's shorter leg (cathode) to Arduino GND. +4. Connect the potentiometer to the breadboard. +5. Connect one outer pin of the potentiometer to 5V. +6. Connect the other outer pin to GND. +7. Connect the center pin to Arduino analog pin A0. + +![Circuit Diagram](https://www.arduino.cc/en/uploads/Tutorial/build-a-potentiometer-circuit-to-control-an-led_2.png) + +**Code:** +```cpp +const int ledPin = 9; // The pin the LED is connected to +const int potPin = A0; // The pin the potentiometer is connected to + +void setup() { + pinMode(ledPin, OUTPUT); +} + +void loop() { + // Read the potentiometer value (0-1023) + int potValue = analogRead(potPin); + + // Map the potentiometer value to the LED's PWM range (0-255) + int brightness = map(potValue, 0, 1023, 0, 255); + + // Set the LED brightness + analogWrite(ledPin, brightness); + + delay(10); +} +``` + +**How it Works:** +The Arduino reads the analog voltage from the potentiometer, which gives a value between 0 and 1023. The `map()` function scales this value to the 0-255 range required by the `analogWrite()` function to control the LED's brightness using PWM. + +--- + +## Tutorial 2: Controlling a Servo Motor + +This project shows how to sweep a servo motor back and forth. + +**Hardware Needed:** +- 1 x Arduino Uno +- 1 x Servo Motor (e.g., SG90) +- Jumper Wires + +**Circuit:** +- **Red wire (Power):** Connect to the 5V pin on the Arduino. +- **Brown/Black wire (Ground):** Connect to the GND pin on the Arduino. +- **Orange/Yellow wire (Signal):** Connect to digital pin 9 on the Arduino. + +**Code:** +```cpp +#include + +Servo myServo; // Create a servo object + +void setup() { + myServo.attach(9); // Attaches the servo on pin 9 to the servo object +} + +void loop() { + // Sweep from 0 degrees to 180 degrees + for (int pos = 0; pos <= 180; pos += 1) { + myServo.write(pos); // Tell servo to go to position in variable 'pos' + delay(15); // Waits 15ms for the servo to reach the position + } + + // Sweep from 180 degrees back to 0 degrees + for (int pos = 180; pos >= 0; pos -= 1) { + myServo.write(pos); + delay(15); + } +} +``` + +**How it Works:** +The `Servo.h` library makes it easy to control servo motors. The `myServo.write()` function sends the correct PWM signal to the servo to move it to the specified angle. diff --git a/3D/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/tutorials.md b/3D/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/tutorials.md new file mode 100644 index 0000000..8c66150 --- /dev/null +++ b/3D/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/tutorials.md @@ -0,0 +1 @@ +https://www.youtube.com/watch?v=RiYnucfy_rs \ No newline at end of file diff --git a/3D/hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/tutorials.md b/3D/hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/tutorials.md new file mode 100644 index 0000000..d5f157f --- /dev/null +++ b/3D/hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/tutorials.md @@ -0,0 +1,3 @@ +https://www.youtube.com/watch?v=RiYnucfy_rs + +https://www.youtube.com/watch?v=hSr557hppwY \ No newline at end of file diff --git a/3D/hardware_guide/MicroControllers_Computers/ESP32/ESP32S3/tutorials.md b/3D/hardware_guide/MicroControllers_Computers/ESP32/ESP32S3/tutorials.md new file mode 100644 index 0000000..8c66150 --- /dev/null +++ b/3D/hardware_guide/MicroControllers_Computers/ESP32/ESP32S3/tutorials.md @@ -0,0 +1 @@ +https://www.youtube.com/watch?v=RiYnucfy_rs \ No newline at end of file diff --git a/3D/hardware_guide/MicroControllers_Computers/ESP32/basicExemples.md/tutorials.md b/3D/hardware_guide/MicroControllers_Computers/ESP32/basicExemples.md/tutorials.md new file mode 100644 index 0000000..2c86312 --- /dev/null +++ b/3D/hardware_guide/MicroControllers_Computers/ESP32/basicExemples.md/tutorials.md @@ -0,0 +1,159 @@ + +# ESP32 Tutorials + +These tutorials leverage the unique features of the ESP32, like Wi-Fi and Bluetooth. + +## Tutorial 1: Web Server to Control an LED + +This project creates a simple web server on your network. You can visit the server's IP address in a browser to turn an LED connected to the ESP32 on or off. + +**Hardware Needed:** +- 1 x ESP32 Development Board +- 1 x Breadboard +- 1 x LED +- 1 x 330Ω Resistor +- Jumper Wires + +**Circuit:** +1. Connect the LED's longer leg (anode) to a 330Ω resistor. +2. Connect the other end of the resistor to GPIO 2 on the ESP32. +3. Connect the LED's shorter leg (cathode) to a GND pin on the ESP32. + +**Code:** +*Remember to add your Wi-Fi credentials to the code.* +```cpp +#include + +// Replace with your network credentials +const char* ssid = "YOUR_SSID"; +const char* password = "YOUR_PASSWORD"; + +// Set web server port number to 80 +WiFiServer server(80); + +// Variable to store the HTTP request +String header; + +// GPIO where the LED is connected +const int ledPin = 2; + +void setup() { + Serial.begin(115200); + pinMode(ledPin, OUTPUT); + digitalWrite(ledPin, LOW); + + // Connect to Wi-Fi + Serial.print("Connecting to "); + Serial.println(ssid); + WiFi.begin(ssid, password); + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + // Print local IP address and start web server + Serial.println("\nWiFi connected."); + Serial.println("IP address: "); + Serial.println(WiFi.localIP()); + server.begin(); +} + +void loop(){ + WiFiClient client = server.available(); + + if (client) { + String currentLine = ""; + while (client.connected()) { + if (client.available()) { + char c = client.read(); + header += c; + if (c == '\n') { + if (currentLine.length() == 0) { + // HTTP headers + client.println("HTTP/1.1 200 OK"); + client.println("Content-type:text/html"); + client.println("Connection: close"); + client.println(); + + // Web page content + if (header.indexOf("GET /2/on") >= 0) { + digitalWrite(ledPin, HIGH); + } else if (header.indexOf("GET /2/off") >= 0) { + digitalWrite(ledPin, LOW); + } + client.println(""); + client.println(""); + client.println(""); + client.println("

ESP32 Web Server

"); + client.println("

"); + client.println("

"); + client.println(""); + client.println(); + break; + } + } + else { + currentLine += c; + } + } + } + header = ""; + client.stop(); + } +} +``` + +**How it Works:** +The ESP32 connects to your Wi-Fi and starts a web server. When you visit its IP address, it serves a simple HTML page with "ON" and "OFF" buttons. Clicking these buttons sends a request back to the ESP32 (e.g., `http://[IP]/2/on`), which the code checks for to turn the LED on or off. + +--- + +## Tutorial 2: Bluetooth Low Energy (BLE) Scanner + +This project uses the ESP32's BLE capabilities to scan for nearby Bluetooth devices and print their information to the Serial Monitor. + +**Hardware Needed:** +- 1 x ESP32 Development Board + +**Code:** +```cpp +#include +#include +#include +#include + +int scanTime = 5; //In seconds +BLEScan* pBLEScan; + +class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks { + void onResult(BLEAdvertisedDevice advertisedDevice) { + Serial.printf("Advertised Device: %s \n", advertisedDevice.toString().c_str()); + } +}; + +void setup() { + Serial.begin(115200); + Serial.println("Scanning..."); + + BLEDevice::init(""); + pBLEScan = BLEDevice::getScan(); //create new scan + pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks()); + pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster + pBLEScan->setInterval(100); + pBLEScan->setWindow(99); +} + +void loop() { + // put your main code here, to run repeatedly: + BLEScanResults foundDevices = pBLEScan->start(scanTime, false); + Serial.print("Devices found: "); + Serial.println(foundDevices.getCount()); + Serial.println("Scan done!"); + pBLEScan->clearResults(); // delete results fromBLEScan buffer to release memory + delay(2000); +} +``` + +**How it Works:** +The ESP32 initializes its BLE radio and performs a scan for a set duration (`scanTime`). When it discovers a device that is advertising its presence, the `onResult` callback function is triggered, printing the device's address and other available information to the serial port. diff --git a/3D/hardware_guide/MicroControllers_Computers/ESP32/tutorials/tutorials.md b/3D/hardware_guide/MicroControllers_Computers/ESP32/tutorials/tutorials.md new file mode 100644 index 0000000..0abffd7 --- /dev/null +++ b/3D/hardware_guide/MicroControllers_Computers/ESP32/tutorials/tutorials.md @@ -0,0 +1,3 @@ +https://www.youtube.com/watch?v=RiYnucfy_rs + +https://github.com/yoursunny/esp32cam \ No newline at end of file diff --git a/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/Raspberry Pi 4 Model B/tutorials.md b/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/Raspberry Pi 4 Model B/tutorials.md new file mode 100644 index 0000000..8c66150 --- /dev/null +++ b/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/Raspberry Pi 4 Model B/tutorials.md @@ -0,0 +1 @@ +https://www.youtube.com/watch?v=RiYnucfy_rs \ No newline at end of file diff --git a/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/Raspberry Pi Zero 2 W/.keep b/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/Raspberry Pi Zero 2 W/.keep deleted file mode 100644 index e69de29..0000000 diff --git a/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/Raspberry Pi Zero 2 W/overview.md b/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/Raspberry Pi Zero 2 W/overview.md deleted file mode 100644 index e69de29..0000000 diff --git a/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/raspberryPi4/basicExemples.md/tutorials.md b/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/raspberryPi4/basicExemples.md/tutorials.md new file mode 100644 index 0000000..51ca47e --- /dev/null +++ b/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/raspberryPi4/basicExemples.md/tutorials.md @@ -0,0 +1,129 @@ +# Raspberry Pi 4 Tutorials + +These tutorials use Python and the `gpiozero` library to interact with hardware. + +## Tutorial 1: Reading a Temperature and Humidity Sensor (DHT11/DHT22) + +This project reads environmental data from a popular DHT sensor and prints it to the console. + +**Hardware Needed:** +- 1 x Raspberry Pi 4 +- 1 x DHT11 (blue) or DHT22 (white) sensor +- Jumper Wires + +**Circuit:** +- **DHT Pin 1 (VCC):** Connect to 3.3V on the Raspberry Pi. +- **DHT Pin 2 (Data):** Connect to GPIO 4 on the Raspberry Pi. +- **DHT Pin 4 (GND):** Connect to a GND pin on the Raspberry Pi. +(Pin 3 is not used). + +**Software Setup:** +You need to install the Adafruit CircuitPython DHT library. + +```bash +sudo apt-get update +sudo apt-get install python3-pip +sudo pip3 install adafruit-circuitpython-dht +sudo apt-get install libgpiod2 +``` + +**Code (`temp_reader.py`):** +```python +import time +import board +import adafruit_dht + +# Initialize the dht device, with data pin connected to: +dhtDevice = adafruit_dht.DHT22(board.D4) # Use DHT22 for DHT22, or DHT11 for DHT11 + +while True: + try: + # Print the values to the serial port + temperature_c = dhtDevice.temperature + temperature_f = temperature_c * (9 / 5) + 32 + humidity = dhtDevice.humidity + print( + "Temp: {:.1f} F / {:.1f} C Humidity: {}%".format( + temperature_f, temperature_c, humidity + ) + ) + + except RuntimeError as error: + # Errors happen fairly often, DHT's are tricky that way! + print(error.args[0]) + time.sleep(2.0) + continue + except Exception as error: + dhtDevice.exit() + raise error + + time.sleep(2.0) + +``` + +**How it Works:** +The `adafruit_circuitpython_dht` library handles the complex timing required to read data from the DHT sensor. The script initializes the sensor on the specified GPIO pin and then enters a loop, reading the temperature and humidity every 2 seconds. + +--- + +## Tutorial 2: Controlling a DC Motor with an L298N Driver + +This project shows how to control the speed and direction of a simple DC motor. + +**Hardware Needed:** +- 1 x Raspberry Pi 4 +- 1 x L298N Motor Driver +- 1 x DC Motor +- An external power supply for the motor (e.g., a 9V battery or a 5V-12V power adapter). **Do not power the motor from the Pi!** +- Jumper Wires + +**Circuit:** +1. Connect the L298N's `VCC` and `GND` to your external power supply. +2. Connect the motor to the `OUT1` and `OUT2` terminals on the L298N. +3. Connect the L298N's `IN1` to Raspberry Pi GPIO 24. +4. Connect the L298N's `IN2` to Raspberry Pi GPIO 23. +5. Connect the L298N's `ENA` (Enable A) to Raspberry Pi GPIO 25. +6. **Crucially, connect one of the Raspberry Pi's GND pins to the L298N's GND pin.** This creates a common ground, which is essential for the circuit to work. + +**Code (`motor_control.py`):** +```python +from gpiozero import Motor, PWMOutputDevice +from time import sleep + +# The Motor class uses two pins for direction +motor = Motor(forward=24, backward=23) + +# The PWMOutputDevice is used for speed control +speed_control = PWMOutputDevice(25) + +print("Motor test starting...") + +try: + while True: + print("Full speed forward") + motor.forward() + speed_control.value = 1.0 # Full speed (0.0 to 1.0) + sleep(2) + + print("Half speed forward") + speed_control.value = 0.5 + sleep(2) + + print("Full speed backward") + motor.backward() + speed_control.value = 1.0 + sleep(2) + + print("Stopping") + motor.stop() + sleep(2) + +except KeyboardInterrupt: + print("\nExiting program.") + motor.stop() + +``` + +**How it Works:** +The `gpiozero` `Motor` class simplifies motor control. It uses one pin for forward and another for backward. The `PWMOutputDevice` is used on the L298N's "Enable" pin to control the motor's speed. A `value` of 1.0 is full speed, and 0.0 is stopped. + diff --git a/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/raspberryPiZero2W/overview.md b/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/raspberryPiZero2W/overview.md new file mode 100644 index 0000000..121f28e --- /dev/null +++ b/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/raspberryPiZero2W/overview.md @@ -0,0 +1,41 @@ + +# Raspberry Pi Zero 2 W Overview + +The Raspberry Pi Zero 2 W is a tiny, low-cost, and yet surprisingly powerful member of the Raspberry Pi family. It packs the processing power of the Raspberry Pi 3 into the miniature form factor of the original Pi Zero, making it an ideal choice for compact and low-power projects that require wireless connectivity. + +## Key Features + +- **Processor:** Broadcom BCM2710A1, Quad-core 64-bit SoC (ARM Cortex-A53 @ 1GHz). This is the same family as the Raspberry Pi 3. +- **RAM:** 512MB LPDDR2 SDRAM. +- **Connectivity:** + - 2.4GHz IEEE 802.11b/g/n wireless LAN. + - Bluetooth 4.2, Bluetooth Low Energy (BLE). +- **Form Factor:** Incredibly small, measuring just 65mm x 30mm. +- **Video & Sound:** + - Mini HDMI port. + - Composite video and reset pins via solder test points. +- **Camera Interface:** CSI-2 camera connector. +- **GPIO:** 40-pin GPIO header (unpopulated, requires soldering). +- **Storage:** MicroSD card slot. +- **Power:** 5V DC via micro USB connector. + +## Pinout + +The Raspberry Pi Zero 2 W uses the standard 40-pin GPIO layout, but the header is unpopulated to save space. You will need to solder on a pin header to use the GPIO pins with breadboards or HATs. + +![Raspberry Pi Zero 2 W Pinout](https://www.raspberrypi.com/documentation/computers/images/GPIO-Pinout-Diagram-2.png) + +## Key Differences + +- **vs. Pi Zero W:** The Zero 2 W is a major performance upgrade, with a quad-core processor that is roughly 5 times faster for multi-threaded tasks. This makes it much more capable for running applications beyond simple scripts. +- **vs. Pi 4:** The Pi 4 is significantly more powerful, has much more RAM, USB 3.0, Gigabit Ethernet, and dual 4K monitor support. The Zero 2 W is designed for projects where size, cost, and power consumption are the primary concerns, while the Pi 4 is a true desktop replacement. + +## Common Use Cases + +The small size and wireless capabilities of the Zero 2 W make it perfect for: + +- **IoT Devices:** Smart home sensors, weather stations. +- **Portable Projects:** Handheld retro gaming consoles (like Pi-hole). +- **Robotics:** The brain for a small robot where space is tight. +- **Security Cameras:** A tiny, discreet network security camera. +- **Wearables:** Projects that need to be embedded in clothing or accessories. diff --git a/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/raspberryPiZero2W/tutorials.md b/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/raspberryPiZero2W/tutorials.md new file mode 100644 index 0000000..8a75879 --- /dev/null +++ b/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/raspberryPiZero2W/tutorials.md @@ -0,0 +1,112 @@ + + +# Raspberry Pi Zero 2 W Tutorials + +Programming the Pi Zero 2 W is identical to any other Raspberry Pi. These tutorials focus on projects that are well-suited to its small size and lower power consumption. + +## Tutorial 1: Creating a Wireless Network Scanner + +This project turns your Pi Zero 2 W into a portable device that can scan for Wi-Fi networks and display their details. This is great for a "headless" (no monitor) setup. + +**Hardware Needed:** +- 1 x Raspberry Pi Zero 2 W +- A power source (e.g., a USB power bank) + +**Software Setup:** +This project uses standard Python libraries that come with Raspberry Pi OS. + +**Code (`wifi_scanner.py`):** +```python +import subprocess +import time + +def scan_wifi(): + """Scans for Wi-Fi networks and returns a list of SSIDs.""" + try: + # Use the nmcli tool to scan for networks + scan_result = subprocess.check_output(['nmcli', 'dev', 'wifi'], text=True) + networks = [] + for line in scan_result.split('\n'): + if line.strip().startswith('*'): + # This is the currently connected network + continue + if len(line.strip()) > 0 and not line.startswith('IN-USE'): + parts = line.strip().split() + if len(parts) > 1: + ssid = parts[1] + if ssid != '--': + networks.append(ssid) + return list(set(networks)) # Return unique SSIDs + except (subprocess.CalledProcessError, FileNotFoundError): + print("Could not execute nmcli. Make sure it's installed.") + return [] + +if __name__ == "__main__": + print("Starting Wi-Fi scan... Press Ctrl+C to stop.") + try: + while True: + print("\n--- New Scan ---") + found_networks = scan_wifi() + if found_networks: + for network in found_networks: + print(f"Found network: {network}") + else: + print("No networks found.") + time.sleep(10) # Wait 10 seconds before scanning again + except KeyboardInterrupt: + print("\nScan stopped.") + +``` + +**How to Run (Headless):** +1. Save this script on your Pi Zero 2 W. +2. SSH into your Pi from another computer. +3. Run the script: `python wifi_scanner.py` +4. The Pi will continuously scan for and display the names (SSIDs) of nearby Wi-Fi networks. + +--- + +## Tutorial 2: Headless Button-Controlled LED + +This project shows how to control an LED with a button without needing a monitor. It's a perfect example of a simple, embedded application for the Zero 2 W. + +**Hardware Needed:** +- 1 x Raspberry Pi Zero 2 W (with soldered GPIO header) +- 1 x Breadboard +- 1 x LED +- 1 x 330Ω Resistor +- 1 x Push Button +- Jumper Wires + +**Circuit:** +1. **LED:** Connect the longer leg to a 330Ω resistor, and the other end of the resistor to GPIO 17. Connect the shorter leg to GND. +2. **Button:** Connect one leg to GPIO 2 and the other leg to GND. + +**Code (`headless_button.py`):** +```python +from gpiozero import LED, Button +from signal import pause + +# Initialize the LED on GPIO 17 +led = LED(17) + +# Initialize the Button on GPIO 2 +# The internal pull-up resistor is enabled by default +button = Button(2, pull_up=True) + +print("Program is running. Press the button to toggle the LED.") +print("Press Ctrl+C in the terminal to exit.") + +# The toggle() function flips the state of the LED +button.when_pressed = led.toggle + +# pause() keeps the script running in the background +pause() +``` + +**How it Works:** +1. SSH into your Pi Zero 2 W. +2. Run the script: `python headless_button.py` +3. The script will run in the foreground. You can now press the physical button connected to your Pi, and the LED will turn on and off. The `pause()` function is essential for keeping the script alive to listen for button presses. + +``` \ No newline at end of file From 513f1261f15810788620d605f74149c4da76468a Mon Sep 17 00:00:00 2001 From: Enzo Ribas Date: Sat, 2 Aug 2025 17:12:59 -0300 Subject: [PATCH 04/10] Move hardware guide files out of 3D directory Renamed and relocated hardware guide documentation files from the '3D/hardware_guide' directory to 'hardware_guide' to simplify the directory structure and improve organization. No content changes were made to the files. --- .../Components/Buttons/overview.md | 0 .../Components/Buttons/tutorials.md | 0 {3D/hardware_guide => hardware_guide}/Components/LEDs/overview.md | 0 .../Components/LEDs/tutorials.md | 0 .../Components/Motors/overview.md | 0 .../Components/Motors/tutorials.md | 0 .../Components/Potentiometers/overview.md | 0 .../Components/Potentiometers/tutorials.md | 0 .../Components/Resistors/overview.md | 0 .../Components/Resistors/tutorials.md | 0 .../Components/Sensors/tutorials.md | 0 .../MicroControllers_Computers/Arduino/arduinoUno/.keep | 0 .../Arduino/arduinoUno/basicExemples.md/examples.md | 0 .../Arduino/arduinoUno/basicExemples.md/tutorials.md | 0 .../MicroControllers_Computers/Arduino/arduinoUno/overview.md | 0 .../MicroControllers_Computers/Arduino/arduinoUno/tutorials.md | 0 .../MicroControllers_Computers/Arduino/howToProgram.md | 0 .../MicroControllers_Computers/Arduino/intro.md | 0 .../MicroControllers_Computers/ESP32/ESP32CAM/conections.md | 0 .../MicroControllers_Computers/ESP32/ESP32CAM/overview.md | 0 .../MicroControllers_Computers/ESP32/ESP32CAM/tutorials.md | 0 .../ESP32/ESP32CAM/tutorials/tutorials.md | 0 .../MicroControllers_Computers/ESP32/ESP32S3/tutorials.md | 0 .../MicroControllers_Computers/ESP32/basicExemples.md/.keep | 0 .../MicroControllers_Computers/ESP32/basicExemples.md/examples.md | 0 .../ESP32/basicExemples.md/tutorials.md | 0 .../MicroControllers_Computers/ESP32/howToProgram.md | 0 .../MicroControllers_Computers/ESP32/intro.md | 0 .../MicroControllers_Computers/ESP32/tutorials/tutorials.md | 0 .../Raspberry Pi 4 Model B/basicExemples.md/examples.md | 0 .../RaspberryPi/Raspberry Pi 4 Model B/overview.md | 0 .../RaspberryPi/Raspberry Pi 4 Model B/tutorials.md | 0 .../MicroControllers_Computers/RaspberryPi/howToProgram.md | 0 .../MicroControllers_Computers/RaspberryPi/intro.md | 0 .../RaspberryPi/raspberryPi4/basicExemples.md/tutorials.md | 0 .../RaspberryPi/raspberryPiZero2W/overview.md | 0 .../RaspberryPi/raspberryPiZero2W/tutorials.md | 0 37 files changed, 0 insertions(+), 0 deletions(-) rename {3D/hardware_guide => hardware_guide}/Components/Buttons/overview.md (100%) rename {3D/hardware_guide => hardware_guide}/Components/Buttons/tutorials.md (100%) rename {3D/hardware_guide => hardware_guide}/Components/LEDs/overview.md (100%) rename {3D/hardware_guide => hardware_guide}/Components/LEDs/tutorials.md (100%) rename {3D/hardware_guide => hardware_guide}/Components/Motors/overview.md (100%) rename {3D/hardware_guide => hardware_guide}/Components/Motors/tutorials.md (100%) rename {3D/hardware_guide => hardware_guide}/Components/Potentiometers/overview.md (100%) rename {3D/hardware_guide => hardware_guide}/Components/Potentiometers/tutorials.md (100%) rename {3D/hardware_guide => hardware_guide}/Components/Resistors/overview.md (100%) rename {3D/hardware_guide => hardware_guide}/Components/Resistors/tutorials.md (100%) rename {3D/hardware_guide => hardware_guide}/Components/Sensors/tutorials.md (100%) rename {3D/hardware_guide => hardware_guide}/MicroControllers_Computers/Arduino/arduinoUno/.keep (100%) rename {3D/hardware_guide => hardware_guide}/MicroControllers_Computers/Arduino/arduinoUno/basicExemples.md/examples.md (100%) rename {3D/hardware_guide => hardware_guide}/MicroControllers_Computers/Arduino/arduinoUno/basicExemples.md/tutorials.md (100%) rename {3D/hardware_guide => hardware_guide}/MicroControllers_Computers/Arduino/arduinoUno/overview.md (100%) rename {3D/hardware_guide => hardware_guide}/MicroControllers_Computers/Arduino/arduinoUno/tutorials.md (100%) rename {3D/hardware_guide => hardware_guide}/MicroControllers_Computers/Arduino/howToProgram.md (100%) rename {3D/hardware_guide => hardware_guide}/MicroControllers_Computers/Arduino/intro.md (100%) rename {3D/hardware_guide => hardware_guide}/MicroControllers_Computers/ESP32/ESP32CAM/conections.md (100%) rename {3D/hardware_guide => hardware_guide}/MicroControllers_Computers/ESP32/ESP32CAM/overview.md (100%) rename {3D/hardware_guide => hardware_guide}/MicroControllers_Computers/ESP32/ESP32CAM/tutorials.md (100%) rename {3D/hardware_guide => hardware_guide}/MicroControllers_Computers/ESP32/ESP32CAM/tutorials/tutorials.md (100%) rename {3D/hardware_guide => hardware_guide}/MicroControllers_Computers/ESP32/ESP32S3/tutorials.md (100%) rename {3D/hardware_guide => hardware_guide}/MicroControllers_Computers/ESP32/basicExemples.md/.keep (100%) rename {3D/hardware_guide => hardware_guide}/MicroControllers_Computers/ESP32/basicExemples.md/examples.md (100%) rename {3D/hardware_guide => hardware_guide}/MicroControllers_Computers/ESP32/basicExemples.md/tutorials.md (100%) rename {3D/hardware_guide => hardware_guide}/MicroControllers_Computers/ESP32/howToProgram.md (100%) rename {3D/hardware_guide => hardware_guide}/MicroControllers_Computers/ESP32/intro.md (100%) rename {3D/hardware_guide => hardware_guide}/MicroControllers_Computers/ESP32/tutorials/tutorials.md (100%) rename {3D/hardware_guide => hardware_guide}/MicroControllers_Computers/RaspberryPi/Raspberry Pi 4 Model B/basicExemples.md/examples.md (100%) rename {3D/hardware_guide => hardware_guide}/MicroControllers_Computers/RaspberryPi/Raspberry Pi 4 Model B/overview.md (100%) rename {3D/hardware_guide => hardware_guide}/MicroControllers_Computers/RaspberryPi/Raspberry Pi 4 Model B/tutorials.md (100%) rename {3D/hardware_guide => hardware_guide}/MicroControllers_Computers/RaspberryPi/howToProgram.md (100%) rename {3D/hardware_guide => hardware_guide}/MicroControllers_Computers/RaspberryPi/intro.md (100%) rename {3D/hardware_guide => hardware_guide}/MicroControllers_Computers/RaspberryPi/raspberryPi4/basicExemples.md/tutorials.md (100%) rename {3D/hardware_guide => hardware_guide}/MicroControllers_Computers/RaspberryPi/raspberryPiZero2W/overview.md (100%) rename {3D/hardware_guide => hardware_guide}/MicroControllers_Computers/RaspberryPi/raspberryPiZero2W/tutorials.md (100%) diff --git a/3D/hardware_guide/Components/Buttons/overview.md b/hardware_guide/Components/Buttons/overview.md similarity index 100% rename from 3D/hardware_guide/Components/Buttons/overview.md rename to hardware_guide/Components/Buttons/overview.md diff --git a/3D/hardware_guide/Components/Buttons/tutorials.md b/hardware_guide/Components/Buttons/tutorials.md similarity index 100% rename from 3D/hardware_guide/Components/Buttons/tutorials.md rename to hardware_guide/Components/Buttons/tutorials.md diff --git a/3D/hardware_guide/Components/LEDs/overview.md b/hardware_guide/Components/LEDs/overview.md similarity index 100% rename from 3D/hardware_guide/Components/LEDs/overview.md rename to hardware_guide/Components/LEDs/overview.md diff --git a/3D/hardware_guide/Components/LEDs/tutorials.md b/hardware_guide/Components/LEDs/tutorials.md similarity index 100% rename from 3D/hardware_guide/Components/LEDs/tutorials.md rename to hardware_guide/Components/LEDs/tutorials.md diff --git a/3D/hardware_guide/Components/Motors/overview.md b/hardware_guide/Components/Motors/overview.md similarity index 100% rename from 3D/hardware_guide/Components/Motors/overview.md rename to hardware_guide/Components/Motors/overview.md diff --git a/3D/hardware_guide/Components/Motors/tutorials.md b/hardware_guide/Components/Motors/tutorials.md similarity index 100% rename from 3D/hardware_guide/Components/Motors/tutorials.md rename to hardware_guide/Components/Motors/tutorials.md diff --git a/3D/hardware_guide/Components/Potentiometers/overview.md b/hardware_guide/Components/Potentiometers/overview.md similarity index 100% rename from 3D/hardware_guide/Components/Potentiometers/overview.md rename to hardware_guide/Components/Potentiometers/overview.md diff --git a/3D/hardware_guide/Components/Potentiometers/tutorials.md b/hardware_guide/Components/Potentiometers/tutorials.md similarity index 100% rename from 3D/hardware_guide/Components/Potentiometers/tutorials.md rename to hardware_guide/Components/Potentiometers/tutorials.md diff --git a/3D/hardware_guide/Components/Resistors/overview.md b/hardware_guide/Components/Resistors/overview.md similarity index 100% rename from 3D/hardware_guide/Components/Resistors/overview.md rename to hardware_guide/Components/Resistors/overview.md diff --git a/3D/hardware_guide/Components/Resistors/tutorials.md b/hardware_guide/Components/Resistors/tutorials.md similarity index 100% rename from 3D/hardware_guide/Components/Resistors/tutorials.md rename to hardware_guide/Components/Resistors/tutorials.md diff --git a/3D/hardware_guide/Components/Sensors/tutorials.md b/hardware_guide/Components/Sensors/tutorials.md similarity index 100% rename from 3D/hardware_guide/Components/Sensors/tutorials.md rename to hardware_guide/Components/Sensors/tutorials.md diff --git a/3D/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/.keep b/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/.keep similarity index 100% rename from 3D/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/.keep rename to hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/.keep diff --git a/3D/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/basicExemples.md/examples.md b/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/basicExemples.md/examples.md similarity index 100% rename from 3D/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/basicExemples.md/examples.md rename to hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/basicExemples.md/examples.md diff --git a/3D/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/basicExemples.md/tutorials.md b/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/basicExemples.md/tutorials.md similarity index 100% rename from 3D/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/basicExemples.md/tutorials.md rename to hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/basicExemples.md/tutorials.md diff --git a/3D/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/overview.md b/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/overview.md similarity index 100% rename from 3D/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/overview.md rename to hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/overview.md diff --git a/3D/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/tutorials.md b/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/tutorials.md similarity index 100% rename from 3D/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/tutorials.md rename to hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/tutorials.md diff --git a/3D/hardware_guide/MicroControllers_Computers/Arduino/howToProgram.md b/hardware_guide/MicroControllers_Computers/Arduino/howToProgram.md similarity index 100% rename from 3D/hardware_guide/MicroControllers_Computers/Arduino/howToProgram.md rename to hardware_guide/MicroControllers_Computers/Arduino/howToProgram.md diff --git a/3D/hardware_guide/MicroControllers_Computers/Arduino/intro.md b/hardware_guide/MicroControllers_Computers/Arduino/intro.md similarity index 100% rename from 3D/hardware_guide/MicroControllers_Computers/Arduino/intro.md rename to hardware_guide/MicroControllers_Computers/Arduino/intro.md diff --git a/3D/hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/conections.md b/hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/conections.md similarity index 100% rename from 3D/hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/conections.md rename to hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/conections.md diff --git a/3D/hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/overview.md b/hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/overview.md similarity index 100% rename from 3D/hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/overview.md rename to hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/overview.md diff --git a/3D/hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/tutorials.md b/hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/tutorials.md similarity index 100% rename from 3D/hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/tutorials.md rename to hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/tutorials.md diff --git a/3D/hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/tutorials/tutorials.md b/hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/tutorials/tutorials.md similarity index 100% rename from 3D/hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/tutorials/tutorials.md rename to hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/tutorials/tutorials.md diff --git a/3D/hardware_guide/MicroControllers_Computers/ESP32/ESP32S3/tutorials.md b/hardware_guide/MicroControllers_Computers/ESP32/ESP32S3/tutorials.md similarity index 100% rename from 3D/hardware_guide/MicroControllers_Computers/ESP32/ESP32S3/tutorials.md rename to hardware_guide/MicroControllers_Computers/ESP32/ESP32S3/tutorials.md diff --git a/3D/hardware_guide/MicroControllers_Computers/ESP32/basicExemples.md/.keep b/hardware_guide/MicroControllers_Computers/ESP32/basicExemples.md/.keep similarity index 100% rename from 3D/hardware_guide/MicroControllers_Computers/ESP32/basicExemples.md/.keep rename to hardware_guide/MicroControllers_Computers/ESP32/basicExemples.md/.keep diff --git a/3D/hardware_guide/MicroControllers_Computers/ESP32/basicExemples.md/examples.md b/hardware_guide/MicroControllers_Computers/ESP32/basicExemples.md/examples.md similarity index 100% rename from 3D/hardware_guide/MicroControllers_Computers/ESP32/basicExemples.md/examples.md rename to hardware_guide/MicroControllers_Computers/ESP32/basicExemples.md/examples.md diff --git a/3D/hardware_guide/MicroControllers_Computers/ESP32/basicExemples.md/tutorials.md b/hardware_guide/MicroControllers_Computers/ESP32/basicExemples.md/tutorials.md similarity index 100% rename from 3D/hardware_guide/MicroControllers_Computers/ESP32/basicExemples.md/tutorials.md rename to hardware_guide/MicroControllers_Computers/ESP32/basicExemples.md/tutorials.md diff --git a/3D/hardware_guide/MicroControllers_Computers/ESP32/howToProgram.md b/hardware_guide/MicroControllers_Computers/ESP32/howToProgram.md similarity index 100% rename from 3D/hardware_guide/MicroControllers_Computers/ESP32/howToProgram.md rename to hardware_guide/MicroControllers_Computers/ESP32/howToProgram.md diff --git a/3D/hardware_guide/MicroControllers_Computers/ESP32/intro.md b/hardware_guide/MicroControllers_Computers/ESP32/intro.md similarity index 100% rename from 3D/hardware_guide/MicroControllers_Computers/ESP32/intro.md rename to hardware_guide/MicroControllers_Computers/ESP32/intro.md diff --git a/3D/hardware_guide/MicroControllers_Computers/ESP32/tutorials/tutorials.md b/hardware_guide/MicroControllers_Computers/ESP32/tutorials/tutorials.md similarity index 100% rename from 3D/hardware_guide/MicroControllers_Computers/ESP32/tutorials/tutorials.md rename to hardware_guide/MicroControllers_Computers/ESP32/tutorials/tutorials.md diff --git a/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/Raspberry Pi 4 Model B/basicExemples.md/examples.md b/hardware_guide/MicroControllers_Computers/RaspberryPi/Raspberry Pi 4 Model B/basicExemples.md/examples.md similarity index 100% rename from 3D/hardware_guide/MicroControllers_Computers/RaspberryPi/Raspberry Pi 4 Model B/basicExemples.md/examples.md rename to hardware_guide/MicroControllers_Computers/RaspberryPi/Raspberry Pi 4 Model B/basicExemples.md/examples.md diff --git a/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/Raspberry Pi 4 Model B/overview.md b/hardware_guide/MicroControllers_Computers/RaspberryPi/Raspberry Pi 4 Model B/overview.md similarity index 100% rename from 3D/hardware_guide/MicroControllers_Computers/RaspberryPi/Raspberry Pi 4 Model B/overview.md rename to hardware_guide/MicroControllers_Computers/RaspberryPi/Raspberry Pi 4 Model B/overview.md diff --git a/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/Raspberry Pi 4 Model B/tutorials.md b/hardware_guide/MicroControllers_Computers/RaspberryPi/Raspberry Pi 4 Model B/tutorials.md similarity index 100% rename from 3D/hardware_guide/MicroControllers_Computers/RaspberryPi/Raspberry Pi 4 Model B/tutorials.md rename to hardware_guide/MicroControllers_Computers/RaspberryPi/Raspberry Pi 4 Model B/tutorials.md diff --git a/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/howToProgram.md b/hardware_guide/MicroControllers_Computers/RaspberryPi/howToProgram.md similarity index 100% rename from 3D/hardware_guide/MicroControllers_Computers/RaspberryPi/howToProgram.md rename to hardware_guide/MicroControllers_Computers/RaspberryPi/howToProgram.md diff --git a/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/intro.md b/hardware_guide/MicroControllers_Computers/RaspberryPi/intro.md similarity index 100% rename from 3D/hardware_guide/MicroControllers_Computers/RaspberryPi/intro.md rename to hardware_guide/MicroControllers_Computers/RaspberryPi/intro.md diff --git a/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/raspberryPi4/basicExemples.md/tutorials.md b/hardware_guide/MicroControllers_Computers/RaspberryPi/raspberryPi4/basicExemples.md/tutorials.md similarity index 100% rename from 3D/hardware_guide/MicroControllers_Computers/RaspberryPi/raspberryPi4/basicExemples.md/tutorials.md rename to hardware_guide/MicroControllers_Computers/RaspberryPi/raspberryPi4/basicExemples.md/tutorials.md diff --git a/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/raspberryPiZero2W/overview.md b/hardware_guide/MicroControllers_Computers/RaspberryPi/raspberryPiZero2W/overview.md similarity index 100% rename from 3D/hardware_guide/MicroControllers_Computers/RaspberryPi/raspberryPiZero2W/overview.md rename to hardware_guide/MicroControllers_Computers/RaspberryPi/raspberryPiZero2W/overview.md diff --git a/3D/hardware_guide/MicroControllers_Computers/RaspberryPi/raspberryPiZero2W/tutorials.md b/hardware_guide/MicroControllers_Computers/RaspberryPi/raspberryPiZero2W/tutorials.md similarity index 100% rename from 3D/hardware_guide/MicroControllers_Computers/RaspberryPi/raspberryPiZero2W/tutorials.md rename to hardware_guide/MicroControllers_Computers/RaspberryPi/raspberryPiZero2W/tutorials.md From e3381502ce658b7894cd70ce1a44c18ceef42451 Mon Sep 17 00:00:00 2001 From: Enzo Ribas Date: Wed, 6 Aug 2025 16:30:51 -0300 Subject: [PATCH 05/10] Move 3D project files to Projects directory Renamed and reorganized various 3D model and documentation files from the root 3D directory into the Projects/3D directory structure for better organization and clarity. --- .../3D}/Finger_Starter/FingerStarterKit_InMoov.rar | Bin {3D => Projects/3D}/Finger_Starter/fingerStarter.md | 0 .../STL PARTS/ForeArm_AndServoBed.rar | Bin .../InMoov silicon finger tip mold - 285972.zip | Bin .../STL PARTS/NewThumbV2_right_fixed.stl | 0 .../STL PARTS/NewThumbV3_base_Balse_version.stl | 0 .../STL PARTS/Rotation-Wrist_InMoov.rar | Bin .../Schemas/Forearm parts scheme.png | Bin 8 files changed, 0 insertions(+), 0 deletions(-) rename {3D => Projects/3D}/Finger_Starter/FingerStarterKit_InMoov.rar (100%) rename {3D => Projects/3D}/Finger_Starter/fingerStarter.md (100%) rename {3D => Projects/3D}/InMoov_3D_RightForearm/STL PARTS/ForeArm_AndServoBed.rar (100%) rename {3D => Projects/3D}/InMoov_3D_RightForearm/STL PARTS/InMoov silicon finger tip mold - 285972.zip (100%) rename {3D => Projects/3D}/InMoov_3D_RightForearm/STL PARTS/NewThumbV2_right_fixed.stl (100%) rename {3D => Projects/3D}/InMoov_3D_RightForearm/STL PARTS/NewThumbV3_base_Balse_version.stl (100%) rename {3D => Projects/3D}/InMoov_3D_RightForearm/STL PARTS/Rotation-Wrist_InMoov.rar (100%) rename {3D => Projects/3D}/InMoov_3D_RightForearm/Schemas/Forearm parts scheme.png (100%) diff --git a/3D/Finger_Starter/FingerStarterKit_InMoov.rar b/Projects/3D/Finger_Starter/FingerStarterKit_InMoov.rar similarity index 100% rename from 3D/Finger_Starter/FingerStarterKit_InMoov.rar rename to Projects/3D/Finger_Starter/FingerStarterKit_InMoov.rar diff --git a/3D/Finger_Starter/fingerStarter.md b/Projects/3D/Finger_Starter/fingerStarter.md similarity index 100% rename from 3D/Finger_Starter/fingerStarter.md rename to Projects/3D/Finger_Starter/fingerStarter.md diff --git a/3D/InMoov_3D_RightForearm/STL PARTS/ForeArm_AndServoBed.rar b/Projects/3D/InMoov_3D_RightForearm/STL PARTS/ForeArm_AndServoBed.rar similarity index 100% rename from 3D/InMoov_3D_RightForearm/STL PARTS/ForeArm_AndServoBed.rar rename to Projects/3D/InMoov_3D_RightForearm/STL PARTS/ForeArm_AndServoBed.rar diff --git a/3D/InMoov_3D_RightForearm/STL PARTS/InMoov silicon finger tip mold - 285972.zip b/Projects/3D/InMoov_3D_RightForearm/STL PARTS/InMoov silicon finger tip mold - 285972.zip similarity index 100% rename from 3D/InMoov_3D_RightForearm/STL PARTS/InMoov silicon finger tip mold - 285972.zip rename to Projects/3D/InMoov_3D_RightForearm/STL PARTS/InMoov silicon finger tip mold - 285972.zip diff --git a/3D/InMoov_3D_RightForearm/STL PARTS/NewThumbV2_right_fixed.stl b/Projects/3D/InMoov_3D_RightForearm/STL PARTS/NewThumbV2_right_fixed.stl similarity index 100% rename from 3D/InMoov_3D_RightForearm/STL PARTS/NewThumbV2_right_fixed.stl rename to Projects/3D/InMoov_3D_RightForearm/STL PARTS/NewThumbV2_right_fixed.stl diff --git a/3D/InMoov_3D_RightForearm/STL PARTS/NewThumbV3_base_Balse_version.stl b/Projects/3D/InMoov_3D_RightForearm/STL PARTS/NewThumbV3_base_Balse_version.stl similarity index 100% rename from 3D/InMoov_3D_RightForearm/STL PARTS/NewThumbV3_base_Balse_version.stl rename to Projects/3D/InMoov_3D_RightForearm/STL PARTS/NewThumbV3_base_Balse_version.stl diff --git a/3D/InMoov_3D_RightForearm/STL PARTS/Rotation-Wrist_InMoov.rar b/Projects/3D/InMoov_3D_RightForearm/STL PARTS/Rotation-Wrist_InMoov.rar similarity index 100% rename from 3D/InMoov_3D_RightForearm/STL PARTS/Rotation-Wrist_InMoov.rar rename to Projects/3D/InMoov_3D_RightForearm/STL PARTS/Rotation-Wrist_InMoov.rar diff --git a/3D/InMoov_3D_RightForearm/Schemas/Forearm parts scheme.png b/Projects/3D/InMoov_3D_RightForearm/Schemas/Forearm parts scheme.png similarity index 100% rename from 3D/InMoov_3D_RightForearm/Schemas/Forearm parts scheme.png rename to Projects/3D/InMoov_3D_RightForearm/Schemas/Forearm parts scheme.png From b2399dafcc93ef01056259d1011453b2524e7dae Mon Sep 17 00:00:00 2001 From: Enzo Ribas Date: Wed, 6 Aug 2025 16:31:27 -0300 Subject: [PATCH 06/10] Add overviews and tutorials for hardware components Introduced overview and tutorial markdown files for 3D Printing, CAD, Power, Screens, Sensors, and Servos in the hardware guide. Expanded and updated tutorial links for Buttons, LEDs, Motors, Potentiometers, Resistors, and Sensors. Added a practice guide for servos with example Arduino code. These additions provide structured documentation and learning resources for hardware components in the project. --- .../Archtecting/3D Printing/overview.md | 42 +++++++++ hardware_guide/Archtecting/CAD/overview.md | 33 +++++++ hardware_guide/Archtecting/CAD/tutorials.md | 1 + .../Components/Buttons/tutorials.md | 4 +- hardware_guide/Components/LEDs/tutorials.md | 3 +- hardware_guide/Components/Motors/tutorials.md | 3 +- .../Components/Potentiometers/tutorials.md | 2 +- hardware_guide/Components/Power/overview.md | 9 ++ hardware_guide/Components/Power/tutorials.md | 1 + .../Components/Resistors/tutorials.md | 3 +- hardware_guide/Components/Screens/overview.md | 29 ++++++ .../Components/Screens/tutorials.md | 1 + hardware_guide/Components/Sensors/overview.md | 18 ++++ .../Components/Sensors/tutorials.md | 6 +- hardware_guide/Components/Servos/overview.md | 21 +++++ hardware_guide/Components/Servos/practice.md | 90 +++++++++++++++++++ hardware_guide/Components/Servos/tutorials.md | 2 + 17 files changed, 262 insertions(+), 6 deletions(-) create mode 100644 hardware_guide/Archtecting/3D Printing/overview.md create mode 100644 hardware_guide/Archtecting/CAD/overview.md create mode 100644 hardware_guide/Archtecting/CAD/tutorials.md create mode 100644 hardware_guide/Components/Power/overview.md create mode 100644 hardware_guide/Components/Power/tutorials.md create mode 100644 hardware_guide/Components/Screens/overview.md create mode 100644 hardware_guide/Components/Screens/tutorials.md create mode 100644 hardware_guide/Components/Sensors/overview.md create mode 100644 hardware_guide/Components/Servos/overview.md create mode 100644 hardware_guide/Components/Servos/practice.md create mode 100644 hardware_guide/Components/Servos/tutorials.md diff --git a/hardware_guide/Archtecting/3D Printing/overview.md b/hardware_guide/Archtecting/3D Printing/overview.md new file mode 100644 index 0000000..cd559f6 --- /dev/null +++ b/hardware_guide/Archtecting/3D Printing/overview.md @@ -0,0 +1,42 @@ +# A General Overview of 3D Printing + +3D printing, also known as additive manufacturing, is a transformative technology that builds three-dimensional objects layer by layer from a digital file. It allows for the creation of complex and custom shapes without the need for traditional manufacturing molds or tooling. + +## Core 3D Printing Technologies + +There are several methods of 3D printing, each with unique advantages and materials. The most common types include: + +### 1. Fused Deposition Modeling (FDM) + +This is the most widely used and accessible form of 3D printing. FDM printers work by extruding a thermoplastic filament through a heated nozzle, melting it, and depositing it layer by layer on a build platform. The layers fuse together as they cool to form a solid object. + +- **Common Materials (Filaments):** + - **PLA (Polylactic Acid):** Biodegradable, easy to print, and affordable. Ideal for prototypes and non-functional parts. + - **ABS (Acrylonitrile Butadiene Styrene):** Strong, durable, and temperature-resistant. Often used for functional parts like car components or phone cases. + - **PETG (Polyethylene Terephthalate Glycol):** A good balance between the ease of printing of PLA and the strength of ABS. It's food-safe and has good chemical resistance. + - **TPU (Thermoplastic Polyurethane):** A flexible, rubber-like material used for creating objects that need to bend or stretch. + +### 2. Stereolithography (SLA) + +SLA was the world's first 3D printing technology. It uses an ultraviolet (UV) laser to cure and solidify a liquid photopolymer resin in a vat, layer by layer. SLA is known for producing parts with extremely high detail and smooth surface finishes. + +- **Common Materials (Resins):** + - **Standard Resin:** Excellent for high-detail prototypes and models. + - **Tough/Durable Resin:** Simulates the properties of ABS plastic, designed for functional parts that can withstand stress. + - **Flexible Resin:** Creates bendable, rubber-like parts. + +### 3. Selective Laser Sintering (SLS) + +SLS uses a high-powered laser to sinter (fuse) small particles of polymer powder. As the laser draws a cross-section of the object onto the powder bed, it fuses the material together. The unfused powder provides support for the object, eliminating the need for dedicated support structures. + +- **Common Materials (Powders):** + - **Nylon (PA 11, PA 12):** The most common material for SLS. It produces strong, durable, and functional parts suitable for end-use applications. + +## The General Workflow + +The process for turning a digital idea into a physical object is consistent across technologies: + +1. **Modeling:** A 3D model is created using CAD (Computer-Aided Design) software or downloaded from an online repository. The final model is typically exported as an STL or STEP file. +2. **Slicing:** The 3D model file is imported into a "slicer" program. This software slices the model into hundreds or thousands of thin, horizontal layers and generates a machine-readable file (like G-code) with instructions for the printer. +3. **Printing:** The instruction file is sent to the 3D printer, which begins building the object layer by layer. +4. **Post-Processing:** After printing, parts often require some form of cleanup. This can include removing support structures (FDM/SLA), washing in a solvent (SLA), curing with UV light (SLA), or cleaning off excess powder (SLS). \ No newline at end of file diff --git a/hardware_guide/Archtecting/CAD/overview.md b/hardware_guide/Archtecting/CAD/overview.md new file mode 100644 index 0000000..328b13a --- /dev/null +++ b/hardware_guide/Archtecting/CAD/overview.md @@ -0,0 +1,33 @@ +# What is CAD? + +Welcome to the world of Computer-Aided Design (CAD)! If you're new to this, don't worry. This guide will give you a basic understanding of what CAD is and why it's essential for our Robotic Arm project. + +## The Basics + +At its core, **CAD is the use of computers to create, modify, analyze, or optimize a design.** Instead of drawing blueprints by hand on a drafting table, we use specialized software to create digital 2D drawings and 3D models. + +Think of it like digital sculpting or building with virtual LEGOs, but with incredible precision and power. + +## Why Do We Use CAD? + +Using CAD offers several key advantages for a hardware project like ours: + +1. **Precision:** We can design parts with exact measurements, ensuring everything fits together perfectly. +2. **Visualization:** A 3D model allows us to see what the robotic arm will look like from every angle before we build anything. We can even simulate its movement to check for collisions or other issues. +3. **Easy Modifications:** If a part doesn't work as expected, we can quickly modify the digital model and 3D print a new version. This is much faster and cheaper than re-making a physical part from scratch. +4. **Collaboration:** Team members can easily share designs and work on different parts of the arm simultaneously. +5. **Manufacturing:** The digital models we create can be directly sent to manufacturing machines, like 3D printers or CNC mills, to create the physical parts. + +## Our CAD Software: Fusion 360 + +For this project, we use **Autodesk Fusion 360**. It's a powerful, cloud-based tool that combines industrial and mechanical design, simulation, collaboration, and machining into a single package. It's a great choice for projects that involve both electronic and mechanical components. + +## What's in this Folder? + +This `CAD` directory is where we store all the digital blueprints for the robotic arm. As you explore, you'll find different types of files, primarily: + +* **`.f3d` / `.f3z`**: These are the native project files for Fusion 360, containing the editable 3D models and assemblies. +* **`.stl`**: These are "mesh" files exported from the models, specifically for 3D printing. +* **`.pdf` / `.dxf`**: These are 2D drawings, useful for manufacturing or documentation. + +Feel free to explore the subdirectories to see how the different components of the arm are organized! diff --git a/hardware_guide/Archtecting/CAD/tutorials.md b/hardware_guide/Archtecting/CAD/tutorials.md new file mode 100644 index 0000000..25f43bc --- /dev/null +++ b/hardware_guide/Archtecting/CAD/tutorials.md @@ -0,0 +1 @@ +[Introduction to Tinkercad Circuits](https://www.youtube.com/watch?v=9RF_BZ1Cg4k) \ No newline at end of file diff --git a/hardware_guide/Components/Buttons/tutorials.md b/hardware_guide/Components/Buttons/tutorials.md index 8c66150..2ae6d44 100644 --- a/hardware_guide/Components/Buttons/tutorials.md +++ b/hardware_guide/Components/Buttons/tutorials.md @@ -1 +1,3 @@ -https://www.youtube.com/watch?v=RiYnucfy_rs \ No newline at end of file +[How to Use a Button with an Arduino](https://www.youtube.com/watch?v=yBgMJssXqHY) +[How to Use a Slide Switch with an Arduino](https://www.youtube.com/watch?v=0ZXYRU9KPG8) +[Usando Botões de Pressão ](https://www.youtube.com/watch?v=ohZ4pQ6KCPA) \ No newline at end of file diff --git a/hardware_guide/Components/LEDs/tutorials.md b/hardware_guide/Components/LEDs/tutorials.md index 8c66150..dc300c3 100644 --- a/hardware_guide/Components/LEDs/tutorials.md +++ b/hardware_guide/Components/LEDs/tutorials.md @@ -1 +1,2 @@ -https://www.youtube.com/watch?v=RiYnucfy_rs \ No newline at end of file +[How to Blink an LED with Arduino ](https://www.youtube.com/watch?v=FKekzzj5844) +[How to Fade an LED with Arduino analogWrite](https://www.youtube.com/watch?v=QCZISwDi_Qo0) \ No newline at end of file diff --git a/hardware_guide/Components/Motors/tutorials.md b/hardware_guide/Components/Motors/tutorials.md index 8c66150..b01e02e 100644 --- a/hardware_guide/Components/Motors/tutorials.md +++ b/hardware_guide/Components/Motors/tutorials.md @@ -1 +1,2 @@ -https://www.youtube.com/watch?v=RiYnucfy_rs \ No newline at end of file +[Control a DC Motor with Arduino](https://www.youtube.com/watch?v=XrJ_zLWFGFw) +[How to Use a Vibration Motor with Arduino](https://www.youtube.com/watch?v=3hoBwa0ccys) \ No newline at end of file diff --git a/hardware_guide/Components/Potentiometers/tutorials.md b/hardware_guide/Components/Potentiometers/tutorials.md index 8c66150..19c0e9e 100644 --- a/hardware_guide/Components/Potentiometers/tutorials.md +++ b/hardware_guide/Components/Potentiometers/tutorials.md @@ -1 +1 @@ -https://www.youtube.com/watch?v=RiYnucfy_rs \ No newline at end of file +[How to Use a Potentiometer with Arduino analogRead](https://www.youtube.com/watch?v=Wa8CjGsOFzY) \ No newline at end of file diff --git a/hardware_guide/Components/Power/overview.md b/hardware_guide/Components/Power/overview.md new file mode 100644 index 0000000..94f4c2d --- /dev/null +++ b/hardware_guide/Components/Power/overview.md @@ -0,0 +1,9 @@ +# Power Component Overview + +The power component is a critical part of the robotic arm, providing the necessary energy for all its operations. A well-designed power system ensures stable and reliable performance of the robotic arm. + +## Key Components + +* **Power Source:** This can be a battery pack or a power adapter, depending on the application's requirements for portability and power intensity. +* **Voltage Regulators:** These components ensure that a stable and consistent voltage is supplied to all the electronic components of the robotic arm, such as the microcontroller and sensors. +* **Power Distribution:** This involves the wiring and connections that distribute power from the source to the various components of the robotic arm. \ No newline at end of file diff --git a/hardware_guide/Components/Power/tutorials.md b/hardware_guide/Components/Power/tutorials.md new file mode 100644 index 0000000..c09d240 --- /dev/null +++ b/hardware_guide/Components/Power/tutorials.md @@ -0,0 +1 @@ +[How to Power an Arduino Project](https://www.youtube.com/watch?v=I7MrL5Q7zvY) \ No newline at end of file diff --git a/hardware_guide/Components/Resistors/tutorials.md b/hardware_guide/Components/Resistors/tutorials.md index 8c66150..efc62e5 100644 --- a/hardware_guide/Components/Resistors/tutorials.md +++ b/hardware_guide/Components/Resistors/tutorials.md @@ -1 +1,2 @@ -https://www.youtube.com/watch?v=RiYnucfy_rs \ No newline at end of file +[Como Funciona e Como é Construído um Resistor](https://www.youtube.com/watch?v=vrBben_xty8) +[Como Funcionam os Resistores e Capacitores?](https://www.youtube.com/watch?v=e_hU6sAON2U) \ No newline at end of file diff --git a/hardware_guide/Components/Screens/overview.md b/hardware_guide/Components/Screens/overview.md new file mode 100644 index 0000000..e9acb7c --- /dev/null +++ b/hardware_guide/Components/Screens/overview.md @@ -0,0 +1,29 @@ +# Screens in Robotics + +Screens are an essential component in many robotics projects, providing a visual interface for users to interact with and monitor the robot's status. They can display a wide range of information, from simple text and sensor readings to complex graphics and video feeds. + +## Why Use a Screen? + +- **User Interface:** Screens provide a user-friendly way to control and interact with a robot. This can range from simple menus and buttons to complex graphical user interfaces (GUIs). +- **Data Visualization:** Screens can be used to display data from sensors, such as distance, temperature, and motor speed. This information can be used to monitor the robot's performance and diagnose problems. +- **Debugging:** During development, screens can be used to display debugging information, such as variable values and program flow. This can be invaluable for identifying and fixing bugs in the robot's code. +- **Status Updates:** Screens can provide real-time status updates, such as battery level, network connectivity, and current task. This allows users to quickly and easily monitor the robot's condition. + +## Types of Screens + +There are many different types of screens available for robotics projects, each with its own advantages and disadvantages. Some of the most common types include: + +- **LCD Screens:** Liquid crystal displays (LCDs) are a popular choice for robotics projects due to their low cost and low power consumption. They are available in a wide range of sizes and resolutions, from small character displays to large graphical displays. +- **OLED Screens:** Organic light-emitting diode (OLED) screens offer several advantages over LCDs, including higher contrast, wider viewing angles, and faster response times. However, they are typically more expensive and have a shorter lifespan. +- **Touch Screens:** Touch screens allow users to interact with the robot by directly touching the screen. This can be a more intuitive and user-friendly way to control the robot than using buttons or other input devices. + +## Choosing a Screen + +When choosing a screen for a robotics project, there are several factors to consider: + +- **Size and Resolution:** The size and resolution of the screen will determine how much information can be displayed and how easy it is to read. +- **Power Consumption:** The power consumption of the screen is an important consideration for battery-powered robots. +- **Interface:** The interface of the screen will determine how it is connected to the robot's microcontroller. Common interfaces include SPI, I2C, and UART. +- **Cost:** The cost of the screen can vary widely depending on the type, size, and features. + +By carefully considering these factors, you can choose the best screen for your robotics project and create a more user-friendly and effective robot. \ No newline at end of file diff --git a/hardware_guide/Components/Screens/tutorials.md b/hardware_guide/Components/Screens/tutorials.md new file mode 100644 index 0000000..59515f7 --- /dev/null +++ b/hardware_guide/Components/Screens/tutorials.md @@ -0,0 +1 @@ +[How to Use an LCD Screen with an Arduino](https://www.youtube.com/watch?v=s_-nIgo71_w) \ No newline at end of file diff --git a/hardware_guide/Components/Sensors/overview.md b/hardware_guide/Components/Sensors/overview.md new file mode 100644 index 0000000..6c04d6a --- /dev/null +++ b/hardware_guide/Components/Sensors/overview.md @@ -0,0 +1,18 @@ +# Sensors Overview + +This document provides an overview of the sensors used in the robotic arm project. + +## Sensor Types + +The robotic arm utilizes various sensors to perceive its environment and internal state. These sensors can be broadly categorized into: + +* **Position Sensors:** These sensors provide information about the angular position of the joints. Common types include encoders and potentiometers. Encoders provide digital feedback, while potentiometers provide analog feedback. +* **Force/Torque Sensors:** These sensors measure the forces and torques exerted by the arm. This information is crucial for tasks that require delicate manipulation or interaction with the environment. Strain gauges are a common type of force/torque sensor. +* **Proximity Sensors:** These sensors detect the presence of objects near the gripper without physical contact. Common types include infrared (IR) sensors and ultrasonic sensors. +* **Other Common Sensors:** + * **Inertial Measurement Units (IMUs):** These sensors combine accelerometers and gyroscopes to measure the orientation and angular velocity of the arm. + * **Cameras:** Cameras provide visual feedback, enabling the robotic arm to perform tasks like object recognition and tracking. + +## Sensor Details + +For detailed information on each sensor, including datasheets, tutorials, and integration guides, please refer to the specific documentation within this directory. diff --git a/hardware_guide/Components/Sensors/tutorials.md b/hardware_guide/Components/Sensors/tutorials.md index 8c66150..ba9b5b6 100644 --- a/hardware_guide/Components/Sensors/tutorials.md +++ b/hardware_guide/Components/Sensors/tutorials.md @@ -1 +1,5 @@ -https://www.youtube.com/watch?v=RiYnucfy_rs \ No newline at end of file +[How to Use a Flex Sensor with an Arduino](https://www.youtube.com/watch?v=_tXWoplbqWo) +[How to Use a Force Sensor with an Arduino](https://www.youtube.com/watch?v=r7oWtcE6QQc) +[How to Use a Photoresistor](https://www.youtube.com/watch?v=XwJQJnY6iUs) +[How to Use a TCS3200 Color Sensor with Arduino](https://www.youtube.com/watch?v=oPFQrKC0nSg) +[Sensor de distância ultrassônico HC-SR04 e Arduino](https://www.youtube.com/watch?v=n-gJ00GTsNg) \ No newline at end of file diff --git a/hardware_guide/Components/Servos/overview.md b/hardware_guide/Components/Servos/overview.md new file mode 100644 index 0000000..ab39c73 --- /dev/null +++ b/hardware_guide/Components/Servos/overview.md @@ -0,0 +1,21 @@ +# Servos + +Servos are essential components in robotics, providing precise control over angular or linear position. They are fundamental for creating articulated and responsive robotic systems. + +## Key Features + +- **Positional Control:** Unlike continuous rotation motors, servos can be commanded to move to a specific angle and hold that position. +- **High Torque:** Servos can provide significant torque for their size, making them suitable for lifting and moving objects. +- **Integrated System:** A servo is a self-contained unit that includes a motor, a feedback sensor (like a potentiometer), and control electronics. +- **Simple Interface:** They are typically controlled using a Pulse Width Modulation (PWM) signal, which is easy to generate with most microcontrollers. + +## How They Work + +A servo motor operates on a closed-loop control system. The control circuit receives a PWM signal that represents the desired position. This signal is compared to the current position of the motor, which is read by the feedback sensor. If there is a difference, the control circuit powers the motor to move it to the correct position. + +## Common Applications + +- **Robotic Arms:** Each joint in a robotic arm is often controlled by a servo, allowing for precise and repeatable movements. +- **Grippers:** Servos are used to open and close grippers, enabling a robot to interact with objects. +- **Steering Systems:** In mobile robots, servos are used for steering. +- **Camera Platforms:** Servos can be used to create pan-and-tilt platforms for cameras and sensors. diff --git a/hardware_guide/Components/Servos/practice.md b/hardware_guide/Components/Servos/practice.md new file mode 100644 index 0000000..771b365 --- /dev/null +++ b/hardware_guide/Components/Servos/practice.md @@ -0,0 +1,90 @@ +# Servo Tutorials + +This section provides tutorials for using servo motors in your robotics projects. + +## 1. Basic Servo Control with Arduino + +This tutorial demonstrates how to control a servo motor using an Arduino board. + +### Components + +- Arduino Uno +- Standard Servo Motor +- Jumper Wires + +### Circuit + +1. Connect the servo's **GND** (brown or black wire) to the Arduino's **GND** pin. +2. Connect the servo's **VCC** (red wire) to the Arduino's **5V** pin. +3. Connect the servo's **Signal** (orange or yellow wire) to a PWM-capable pin on the Arduino, such as pin 9. + +### Code + +```cpp +#include + +Servo myServo; + +void setup() { + myServo.attach(9); // Attaches the servo on pin 9 to the servo object +} + +void loop() { + myServo.write(0); // Move the servo to 0 degrees + delay(1000); // Wait for a second + myServo.write(90); // Move the servo to 90 degrees + delay(1000); // Wait for a second + myServo.write(180); // Move the servo to 180 degrees + delay(1000); // Wait for a second +} +``` + +### Instructions + +1. Upload the code to your Arduino board. +2. The servo will sweep back and forth between 0, 90, and 180 degrees. + +## 2. Controlling a Servo with a Potentiometer + +This tutorial shows how to control the position of a servo motor using a potentiometer. + +### Components + +- Arduino Uno +- Standard Servo Motor +- 10kΩ Potentiometer +- Jumper Wires + +### Circuit + +1. Connect the servo as described in the previous tutorial. +2. Connect one of the potentiometer's outer pins to **GND**. +3. Connect the other outer pin to **5V**. +4. Connect the center pin to an analog input pin on the Arduino, such as **A0**. + +### Code + +```cpp +#include + +Servo myServo; +int potPin = A0; +int potValue; +int angle; + +void setup() { + myServo.attach(9); +} + +void loop() { + potValue = analogRead(potPin); + angle = map(potValue, 0, 1023, 0, 180); + myServo.write(angle); + delay(15); +} +``` + +### Instructions + +1. Upload the code to your Arduino board. +2. Turn the potentiometer to control the position of the servo motor. diff --git a/hardware_guide/Components/Servos/tutorials.md b/hardware_guide/Components/Servos/tutorials.md new file mode 100644 index 0000000..78574b5 --- /dev/null +++ b/hardware_guide/Components/Servos/tutorials.md @@ -0,0 +1,2 @@ +[Continuous Rotation Servo Motors and Arduino](https://www.youtube.com/watch?v=NV6YHZ2RAqc) +[Control a Positional Servo Motor with an Arduino](https://www.youtube.com/watch?v=qJC1nt_eJZs) \ No newline at end of file From a112a390d33547ebba705268fee5141c8eaaffdd Mon Sep 17 00:00:00 2001 From: Enzo Ribas Date: Wed, 6 Aug 2025 16:41:05 -0300 Subject: [PATCH 07/10] Fix photos of pinouts and tutorials links Removed redundant and outdated tutorial files for Arduino, ESP32, and Raspberry Pi boards. Consolidated and updated tutorial links in central 'tutorials/tutorials.md' files for Arduino and ESP32, and updated the ESP32-CAM pinout image. This improves organization and ensures up-to-date resources are provided. --- .../Arduino/arduinoUno/tutorials.md | 1 - .../Arduino/tutorials/tutorials.md | 1 + .../ESP32/ESP32CAM/overview.md | 2 +- .../ESP32/ESP32CAM/tutorials.md | 3 - .../ESP32/ESP32CAM/tutorials/tutorials.md | 127 -------------- .../ESP32/ESP32S3/tutorials.md | 1 - .../ESP32/basicExemples.md/tutorials.md | 159 ------------------ .../ESP32/tutorials/tutorials.md | 4 +- .../Raspberry Pi 4 Model B/tutorials.md | 1 - 9 files changed, 5 insertions(+), 294 deletions(-) delete mode 100644 hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/tutorials.md create mode 100644 hardware_guide/MicroControllers_Computers/Arduino/tutorials/tutorials.md delete mode 100644 hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/tutorials.md delete mode 100644 hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/tutorials/tutorials.md delete mode 100644 hardware_guide/MicroControllers_Computers/ESP32/ESP32S3/tutorials.md delete mode 100644 hardware_guide/MicroControllers_Computers/ESP32/basicExemples.md/tutorials.md delete mode 100644 hardware_guide/MicroControllers_Computers/RaspberryPi/Raspberry Pi 4 Model B/tutorials.md diff --git a/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/tutorials.md b/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/tutorials.md deleted file mode 100644 index 8c66150..0000000 --- a/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/tutorials.md +++ /dev/null @@ -1 +0,0 @@ -https://www.youtube.com/watch?v=RiYnucfy_rs \ No newline at end of file diff --git a/hardware_guide/MicroControllers_Computers/Arduino/tutorials/tutorials.md b/hardware_guide/MicroControllers_Computers/Arduino/tutorials/tutorials.md new file mode 100644 index 0000000..700456e --- /dev/null +++ b/hardware_guide/MicroControllers_Computers/Arduino/tutorials/tutorials.md @@ -0,0 +1 @@ +[SparkFun Arduino Comparison Guide](https://www.youtube.com/watch?v=hjRSwBcLcSU&t=27s) \ No newline at end of file diff --git a/hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/overview.md b/hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/overview.md index 1e3c273..56a9ec5 100644 --- a/hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/overview.md +++ b/hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/overview.md @@ -17,7 +17,7 @@ The ESP32-CAM is a small, low-cost development board that combines an ESP32-S mi ## Pinout -![ESP32-CAM Pinout](https://i0.wp.com/randomnerdtutorials.com/wp-content/uploads/2019/03/esp32-cam-pinout-ai-thinker.png?w=712&quality=100&strip=all&ssl=1) +![ESP32-CAM Pinout](https://lastminuteengineers.com/wp-content/uploads/iot/ESP32-CAM-Pinout.png) ## Getting Started diff --git a/hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/tutorials.md b/hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/tutorials.md deleted file mode 100644 index d5f157f..0000000 --- a/hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/tutorials.md +++ /dev/null @@ -1,3 +0,0 @@ -https://www.youtube.com/watch?v=RiYnucfy_rs - -https://www.youtube.com/watch?v=hSr557hppwY \ No newline at end of file diff --git a/hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/tutorials/tutorials.md b/hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/tutorials/tutorials.md deleted file mode 100644 index 75d1dc2..0000000 --- a/hardware_guide/MicroControllers_Computers/ESP32/ESP32CAM/tutorials/tutorials.md +++ /dev/null @@ -1,127 +0,0 @@ - - -# ESP32-CAM Tutorials - -Here are some tutorials to help you get started with the ESP32-CAM. - -## 1. Camera Web Server - -This is the most popular ESP32-CAM project. It hosts a web page on your local network that streams video from the camera. - -### Arduino IDE Setup - -1. **Board:** In the Arduino IDE, go to `Tools > Board` and select "AI Thinker ESP32-CAM". -2. **Example Sketch:** Go to `File > Examples > ESP32 > Camera` and open the `CameraWebServer` example. - -### Code Configuration - -In the `CameraWebServer` sketch, you need to make a few changes: - -1. **Select Camera Model:** Uncomment the line for the AI-Thinker model: - ```cpp - #define CAMERA_MODEL_AI_THINKER - ``` -2. **Enter Wi-Fi Credentials:** Find the following lines and replace `ssid` and `password` with your Wi-Fi network's name and password: - ```cpp - const char* ssid = "YOUR_SSID"; - const char* password = "YOUR_PASSWORD"; - ``` - -### Upload and Run - -1. Follow the programming connections and procedure outlined in the `conections.md` file (connect `GPIO 0` to `GND`). -2. Upload the sketch. -3. Disconnect `GPIO 0` from `GND` and press the reset button. -4. Open the Serial Monitor and set the baud rate to `115200`. -5. The ESP32-CAM will connect to your Wi-Fi and print its IP address in the Serial Monitor. -6. Open a web browser on a device connected to the same Wi-Fi network and enter the IP address. -7. You should see a web page with a video stream from your camera! - -## 2. Taking a Photo and Saving to MicroSD Card - -This project shows you how to capture an image and save it as a `.jpg` file on a MicroSD card. - -### Arduino IDE Setup - -1. Make sure you have the ESP32 board support installed. -2. Insert a formatted MicroSD card into the ESP32-CAM's card slot. - -### Example Code - -This code initializes the camera and the SD card, takes a picture, and saves it. You can then trigger this action with a button press or another sensor. - -```cpp -#include "esp_camera.h" -#include "FS.h" -#include "SD_MMC.h" - -// Pin definition for CAMERA_MODEL_AI_THINKER -#define PWDN_GPIO_NUM 32 -#define RESET_GPIO_NUM -1 -#define XCLK_GPIO_NUM 0 -#define SIOD_GPIO_NUM 26 -#define SIOC_GPIO_NUM 27 -#define Y9_GPIO_NUM 35 -#define Y8_GPIO_NUM 34 -#define Y7_GPIO_NUM 39 -#define Y6_GPIO_NUM 36 -#define Y5_GPIO_NUM 21 -#define Y4_GPIO_NUM 19 -#define Y3_GPIO_NUM 18 -#define Y2_GPIO_NUM 5 -#define VSYNC_GPIO_NUM 25 -#define HREF_GPIO_NUM 23 -#define PCLK_GPIO_NUM 22 - -void setup() { - Serial.begin(115200); - Serial.setDebugOutput(true); - Serial.println(); - - camera_config_t config; - // ... (camera configuration - see full example online) ... - - // initialize the camera - esp_err_t err = esp_camera_init(&config); - if (err != ESP_OK) { - Serial.printf("Camera init failed with error 0x%x", err); - return; - } - - if(!SD_MMC.begin()){ - Serial.println("Card Mount Failed"); - return; - } - uint8_t cardType = SD_MMC.cardType(); - if(cardType == CARD_NONE){ - Serial.println("No SD card attached"); - return; - } - - // Take a picture - camera_fb_t * fb = esp_camera_fb_get(); - if(!fb) { - Serial.println("Camera capture failed"); - return; - } - - // Save picture to microSD card - fs::FS &fs = SD_MMC; - String path = "/picture.jpg"; - File file = fs.open(path.c_str(), FILE_WRITE); - if(!file){ - Serial.println("Failed to open file in writing mode"); - } else { - file.write(fb->buf, fb->len); // payload (image), payload length - Serial.printf("Saved file to path: %s\n", path.c_str()); - } - file.close(); - esp_camera_fb_return(fb); -} - -void loop() { - // Code in setup runs once -} -``` -*Note: This is a simplified version. For the full, working code, please refer to online tutorials from resources like Random Nerd Tutorials.* - diff --git a/hardware_guide/MicroControllers_Computers/ESP32/ESP32S3/tutorials.md b/hardware_guide/MicroControllers_Computers/ESP32/ESP32S3/tutorials.md deleted file mode 100644 index 8c66150..0000000 --- a/hardware_guide/MicroControllers_Computers/ESP32/ESP32S3/tutorials.md +++ /dev/null @@ -1 +0,0 @@ -https://www.youtube.com/watch?v=RiYnucfy_rs \ No newline at end of file diff --git a/hardware_guide/MicroControllers_Computers/ESP32/basicExemples.md/tutorials.md b/hardware_guide/MicroControllers_Computers/ESP32/basicExemples.md/tutorials.md deleted file mode 100644 index 2c86312..0000000 --- a/hardware_guide/MicroControllers_Computers/ESP32/basicExemples.md/tutorials.md +++ /dev/null @@ -1,159 +0,0 @@ - -# ESP32 Tutorials - -These tutorials leverage the unique features of the ESP32, like Wi-Fi and Bluetooth. - -## Tutorial 1: Web Server to Control an LED - -This project creates a simple web server on your network. You can visit the server's IP address in a browser to turn an LED connected to the ESP32 on or off. - -**Hardware Needed:** -- 1 x ESP32 Development Board -- 1 x Breadboard -- 1 x LED -- 1 x 330Ω Resistor -- Jumper Wires - -**Circuit:** -1. Connect the LED's longer leg (anode) to a 330Ω resistor. -2. Connect the other end of the resistor to GPIO 2 on the ESP32. -3. Connect the LED's shorter leg (cathode) to a GND pin on the ESP32. - -**Code:** -*Remember to add your Wi-Fi credentials to the code.* -```cpp -#include - -// Replace with your network credentials -const char* ssid = "YOUR_SSID"; -const char* password = "YOUR_PASSWORD"; - -// Set web server port number to 80 -WiFiServer server(80); - -// Variable to store the HTTP request -String header; - -// GPIO where the LED is connected -const int ledPin = 2; - -void setup() { - Serial.begin(115200); - pinMode(ledPin, OUTPUT); - digitalWrite(ledPin, LOW); - - // Connect to Wi-Fi - Serial.print("Connecting to "); - Serial.println(ssid); - WiFi.begin(ssid, password); - while (WiFi.status() != WL_CONNECTED) { - delay(500); - Serial.print("."); - } - // Print local IP address and start web server - Serial.println("\nWiFi connected."); - Serial.println("IP address: "); - Serial.println(WiFi.localIP()); - server.begin(); -} - -void loop(){ - WiFiClient client = server.available(); - - if (client) { - String currentLine = ""; - while (client.connected()) { - if (client.available()) { - char c = client.read(); - header += c; - if (c == '\n') { - if (currentLine.length() == 0) { - // HTTP headers - client.println("HTTP/1.1 200 OK"); - client.println("Content-type:text/html"); - client.println("Connection: close"); - client.println(); - - // Web page content - if (header.indexOf("GET /2/on") >= 0) { - digitalWrite(ledPin, HIGH); - } else if (header.indexOf("GET /2/off") >= 0) { - digitalWrite(ledPin, LOW); - } - client.println(""); - client.println(""); - client.println(""); - client.println("

ESP32 Web Server

"); - client.println("

"); - client.println("

"); - client.println(""); - client.println(); - break; - } - } - else { - currentLine += c; - } - } - } - header = ""; - client.stop(); - } -} -``` - -**How it Works:** -The ESP32 connects to your Wi-Fi and starts a web server. When you visit its IP address, it serves a simple HTML page with "ON" and "OFF" buttons. Clicking these buttons sends a request back to the ESP32 (e.g., `http://[IP]/2/on`), which the code checks for to turn the LED on or off. - ---- - -## Tutorial 2: Bluetooth Low Energy (BLE) Scanner - -This project uses the ESP32's BLE capabilities to scan for nearby Bluetooth devices and print their information to the Serial Monitor. - -**Hardware Needed:** -- 1 x ESP32 Development Board - -**Code:** -```cpp -#include -#include -#include -#include - -int scanTime = 5; //In seconds -BLEScan* pBLEScan; - -class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks { - void onResult(BLEAdvertisedDevice advertisedDevice) { - Serial.printf("Advertised Device: %s \n", advertisedDevice.toString().c_str()); - } -}; - -void setup() { - Serial.begin(115200); - Serial.println("Scanning..."); - - BLEDevice::init(""); - pBLEScan = BLEDevice::getScan(); //create new scan - pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks()); - pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster - pBLEScan->setInterval(100); - pBLEScan->setWindow(99); -} - -void loop() { - // put your main code here, to run repeatedly: - BLEScanResults foundDevices = pBLEScan->start(scanTime, false); - Serial.print("Devices found: "); - Serial.println(foundDevices.getCount()); - Serial.println("Scan done!"); - pBLEScan->clearResults(); // delete results fromBLEScan buffer to release memory - delay(2000); -} -``` - -**How it Works:** -The ESP32 initializes its BLE radio and performs a scan for a set duration (`scanTime`). When it discovers a device that is advertising its presence, the `onResult` callback function is triggered, printing the device's address and other available information to the serial port. diff --git a/hardware_guide/MicroControllers_Computers/ESP32/tutorials/tutorials.md b/hardware_guide/MicroControllers_Computers/ESP32/tutorials/tutorials.md index 0abffd7..e382ee9 100644 --- a/hardware_guide/MicroControllers_Computers/ESP32/tutorials/tutorials.md +++ b/hardware_guide/MicroControllers_Computers/ESP32/tutorials/tutorials.md @@ -1,3 +1,5 @@ -https://www.youtube.com/watch?v=RiYnucfy_rs +[Arduino To ESP32: How to Get Started!](https://www.youtube.com/watch?v=RiYnucfy_rs) +[ESP32-Cam Complete Guide](https://www.youtube.com/watch?v=hSr557hppwY) +[ESP8266, ESP32, ESP32-C3 e ESP32-S3: Qual a Diferença?](https://www.youtube.com/watch?v=0zutyYWWRHA) https://github.com/yoursunny/esp32cam \ No newline at end of file diff --git a/hardware_guide/MicroControllers_Computers/RaspberryPi/Raspberry Pi 4 Model B/tutorials.md b/hardware_guide/MicroControllers_Computers/RaspberryPi/Raspberry Pi 4 Model B/tutorials.md deleted file mode 100644 index 8c66150..0000000 --- a/hardware_guide/MicroControllers_Computers/RaspberryPi/Raspberry Pi 4 Model B/tutorials.md +++ /dev/null @@ -1 +0,0 @@ -https://www.youtube.com/watch?v=RiYnucfy_rs \ No newline at end of file From ad1939803fe06680f5fd9303bdc619bb96b3ae91 Mon Sep 17 00:00:00 2001 From: Enzo Ribas Date: Wed, 6 Aug 2025 19:42:49 -0300 Subject: [PATCH 08/10] Add hardware guide README for Atom Project Introduces a README file in the hardware_guide directory, providing an overview of electronic components, microcontrollers, computers, and architecting tools used in the Atom Project. This guide is intended to help newcomers understand the project's hardware ecosystem and navigate related documentation. --- hardware_guide/README.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 hardware_guide/README.md diff --git a/hardware_guide/README.md b/hardware_guide/README.md new file mode 100644 index 0000000..a663e7b --- /dev/null +++ b/hardware_guide/README.md @@ -0,0 +1,32 @@ +# Hardware Guide for the Atom Project + +Welcome to the hardware guide for the Atom Project! This guide is designed to help newcomers understand the basic concepts of the electronic components, microcontrollers, and computers we use in this project. + +## Components + +Here is a list of the components you will encounter in this project. Each link will take you to an overview of the component. + +* **[Buttons](./Components/Buttons/overview.md):** Learn about the different types of buttons and how they are used as simple input devices. +* **[LEDs](./Components/LEDs/overview.md):** Understand how Light Emitting Diodes (LEDs) work and how to use them as visual indicators. +* **[Motors](./Components/Motors/overview.md):** Get an overview of the different types of motors used to create movement in our projects. +* **[Potentiometers](./Components/Potentiometers/overview.md):** Learn how potentiometers can be used as analog input devices to control things like volume or speed. +* **[Power](./Components/Power/overview.md):** Understand the basics of power supplies and how to safely power your projects. +* **[Resistors](./Components/Resistors/overview.md):** Learn why resistors are essential components in electronic circuits. +* **[Screens](./Components/Screens/overview.md):** Get an overview of the different types of screens we use to display information. +* **[Sensors](./Components/Sensors/overview.md):** Explore the world of sensors and how they allow our projects to interact with the environment. +* **[Servos](./Components/Servos/overview.md):** Understand how servo motors work and how to control their precise movements. + +## Microcontrollers and Computers + +These are the brains of our projects. Here you can learn more about the different microcontrollers and single-board computers we use. + +* **[Arduino](./MicroControllers_Computers/Arduino/intro.md):** An introduction to the Arduino platform, known for its simplicity and extensive community support. +* **[ESP32](./MicroControllers_Computers/ESP32/intro.md):** Learn about the ESP32, a powerful microcontroller with built-in Wi-Fi and Bluetooth. +* **[Raspberry Pi](./MicroControllers_Computers/RaspberryPi/intro.md):** An introduction to the Raspberry Pi, a versatile single-board computer that can run a full-fledged operating system. + +## Architecting + +This section covers the tools and techniques we use to design and build the physical parts of our projects. + +* **[3D Printing](./Archtecting/3D%20Printing/overview.md):** An overview of 3D printing and how we use it to create custom parts and enclosures. +* **[CAD](./Archtecting/CAD/overview.md):** Learn about Computer-Aided Design (CAD) and the software we use to design our 3D models. From 8b770c19c76a25c19af6dac620d77c3ab069bb57 Mon Sep 17 00:00:00 2001 From: Enzo Ribas Date: Wed, 6 Aug 2025 19:44:07 -0300 Subject: [PATCH 09/10] Fix link: Arduino Uno Pinout --- .../MicroControllers_Computers/Arduino/arduinoUno/overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/overview.md b/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/overview.md index 16406d3..ca4c820 100644 --- a/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/overview.md +++ b/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/overview.md @@ -18,7 +18,7 @@ The Arduino Uno is the most popular and widely used board in the Arduino family. ## Pinout -![Arduino Uno Pinout](https://content.arduino.cc/assets/Pinout-Unorev3_latest.png) +![Arduino Uno Pinout](https://microcontrollerslab.com/wp-content/uploads/2018/10/Arduino-Uno-pinout-diagram.jpg) ## Power From f704a49359be7578c55ce3bb34a8bd8111acda2e Mon Sep 17 00:00:00 2001 From: Enzo Ribas Date: Wed, 6 Aug 2025 19:55:37 -0300 Subject: [PATCH 10/10] Add local circuit diagram image and update reference Added circuitDiagram.png to the media directory and updated the tutorials.md file to reference the local image instead of an external URL. This improves documentation reliability and ensures the diagram is available offline. --- .../basicExemples.md/media/circuitDiagram.png | Bin 0 -> 100992 bytes .../arduinoUno/basicExemples.md/tutorials.md | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/basicExemples.md/media/circuitDiagram.png diff --git a/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/basicExemples.md/media/circuitDiagram.png b/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/basicExemples.md/media/circuitDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..4341deedfa7cd29edf2babcec3a2a647d71e8276 GIT binary patch literal 100992 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 literal 0 HcmV?d00001 diff --git a/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/basicExemples.md/tutorials.md b/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/basicExemples.md/tutorials.md index e7f655c..106e42d 100644 --- a/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/basicExemples.md/tutorials.md +++ b/hardware_guide/MicroControllers_Computers/Arduino/arduinoUno/basicExemples.md/tutorials.md @@ -24,7 +24,7 @@ This project uses a potentiometer to control the brightness of an LED. 6. Connect the other outer pin to GND. 7. Connect the center pin to Arduino analog pin A0. -![Circuit Diagram](https://www.arduino.cc/en/uploads/Tutorial/build-a-potentiometer-circuit-to-control-an-led_2.png) +![Circuit Diagram](media/circuitDiagram.png) **Code:** ```cpp