diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..64d18d2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.lck +fp-info-cache \ No newline at end of file diff --git a/README.md b/README.md index aebaa38..ee4ccb5 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,29 @@ -# boite-histoire -Une boite à histoire complètement open source +# Boite à histoire + +Une boite à histoire complètement open source et open hardware, un projet du Fablab'ke. + +Il existe sur le marché une série de “boîtes à histoires” qui permettent aux enfants d’écouter des histoires en audio. C’est un système qui fonctionne très bien et permet d’éviter les écrans tout en découvrant des univers assez variés. Écouter des histoires permet aussi de développer le langage et l’imaginaire. + +Il y a par exemple la [boîte Lunii ](https://lunii.com/fr-be/) et [pleins d’autres modèles + +](https://www.madmoizelle.com/quelles-sont-les-meilleures-boites-a-histoires-pour-les-enfants-1392363) + +L’inconvénient majeur de toutes ces boîtes est le coût élevé de l’appareil (entre 70 et 100 euros) et le coût des packs d’histoires (une dizaine d’euros à chaque fois que l’on veut ajouter quelques histoires sur sa boîte sans pouvoir les partager avec d’autres). + +Un autre inconvénient est que les bibliothèques d’histoires sont spécifiques à chaque fabricant, avec un contenu souvent assez lisse et peu multiculturel. + +# Proposition + +L’objet de cette proposition est de développer et de fabriquer “notre” boîte à histoire maison, de créer en partenariat avec les autres cellules et partenaires plusieurs projets autour de celle-ci, et d’en faire bénéficier les familles de la maison des cultures et au-delà. + +Une première série de 30 boites à histoire a été construite avec les classes d'informatique de Campus Saint Jean. + + +Ce projet est en cours de conception. [Contactez le fablab'ke](https://fablabke.be) pour plus d'informations. + +- Principe de fonctionnement (todo) +- Liste des composants nécessaires (todo) +- Carte électronique chez Aisler (todo) +- [Assemblage de la carte électronique](./guides/pcb.md) +- Code source arduino, facilement compilable avec platformio ou l'ide arduino : [/dossier arduino](./arduino) +- Code circuitpython (todo) diff --git a/arduino/include/README b/arduino/include/README new file mode 100644 index 0000000..194dcd4 --- /dev/null +++ b/arduino/include/README @@ -0,0 +1,39 @@ + +This directory is intended for project header files. + +A header file is a file containing C declarations and macro definitions +to be shared between several project source files. You request the use of a +header file in your project source file (C, C++, etc) located in `src` folder +by including it, with the C preprocessing directive `#include'. + +```src/main.c + +#include "header.h" + +int main (void) +{ + ... +} +``` + +Including a header file produces the same results as copying the header file +into each source file that needs it. Such copying would be time-consuming +and error-prone. With a header file, the related declarations appear +in only one place. If they need to be changed, they can be changed in one +place, and programs that include the header file will automatically use the +new version when next recompiled. The header file eliminates the labor of +finding and changing all the copies as well as the risk that a failure to +find one copy will result in inconsistencies within a program. + +In C, the usual convention is to give header files names that end with `.h'. +It is most portable to use only letters, digits, dashes, and underscores in +header file names, and at most one dot. + +Read more about using header files in official GCC documentation: + +* Include Syntax +* Include Operation +* Once-Only Headers +* Computed Includes + +https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html diff --git a/arduino/lib/README b/arduino/lib/README new file mode 100644 index 0000000..6debab1 --- /dev/null +++ b/arduino/lib/README @@ -0,0 +1,46 @@ + +This directory is intended for project specific (private) libraries. +PlatformIO will compile them to static libraries and link into executable file. + +The source code of each library should be placed in a an own separate directory +("lib/your_library_name/[here are source files]"). + +For example, see a structure of the following two libraries `Foo` and `Bar`: + +|--lib +| | +| |--Bar +| | |--docs +| | |--examples +| | |--src +| | |- Bar.c +| | |- Bar.h +| | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html +| | +| |--Foo +| | |- Foo.c +| | |- Foo.h +| | +| |- README --> THIS FILE +| +|- platformio.ini +|--src + |- main.c + +and a contents of `src/main.c`: +``` +#include +#include + +int main (void) +{ + ... +} + +``` + +PlatformIO Library Dependency Finder will find automatically dependent +libraries scanning project source files. + +More information about PlatformIO Library Dependency Finder +- https://docs.platformio.org/page/librarymanager/ldf.html diff --git a/arduino/platformio.ini b/arduino/platformio.ini new file mode 100644 index 0000000..2f5b5ef --- /dev/null +++ b/arduino/platformio.ini @@ -0,0 +1,25 @@ +[env:pico] +platform = https://github.com/maxgerhardt/platform-raspberrypi.git +board = pico +framework = arduino +board_build.core = earlephilhower +lib_deps = + https://github.com/pschatzmann/arduino-libhelix + https://github.com/pschatzmann/arduino-audio-tools#v0.9.7 + https://github.com/LennartHennigs/Button2 + https://github.com/jonnieZG/EWMA + https://github.com/earlephilhower/ESP8266SdFat +; flags nécessaires pour rebooter pour upload automatique : +build_flags = -DCORE_DEBUG_LEVEL=3 -DARDUINO_USB_MODE -DARDUINO_USB_CDC_ON_BOOT=1 + +;permet d'augmenter la fréquence : +;board_build.f_cpu = 175000000L + +[platformio] +src_dir = storybox + + +; une librairie plus nécessaire à priori : +;https://github.com/earlephilhower/ESP8266SdFat + + diff --git a/arduino/storybox/storybox.ino b/arduino/storybox/storybox.ino new file mode 100644 index 0000000..9f4e9f5 --- /dev/null +++ b/arduino/storybox/storybox.ino @@ -0,0 +1,433 @@ +/** +Story box + +Code pour la boite à histoire, version arduino. + +Librairies utilisées : +https://github.com/LennartHennigs/Button2 (latest) // simple button handler +https://github.com/pschatzmann/arduino-audio-tools #V0.9.7 +https://github.com/pschatzmann/arduino-libhelix (latest) +https://github.com/jonnieZG/EWMA // smooth analog values (for smooth volume opperations) + +à tester : https://github.com/jonnieZG/EButton + + */ + +#include +#include +// #include +#include "AudioTools.h" +#include "AudioCodecs/CodecMP3Helix.h" +#include "Button2.h" +#include + +/***************** CONFIG *******************/ + +// max number of stories in a directory +#define MAXSTORIES 50 + +// max volume levels for speaker and headphones +#define MAX_SPEAKER_VOLUME 1024 // 0 -> 1024 // boost > 1024 +#define MAX_HEADPHONE_VOLUME 150 // 0 -> 1024 + +#define JACK_DETECTION_LEVEL 800 // bellow this value it will be considered speaker, above jack + +#define VOLUME_STEPS 32 // How many steps there are in the volume control (max 1024) + +#define DEBUG true + +/****************** no more config below vvvv **************/ + +/********************** HARDWARE PINS *************************/ +#define SDCARD_SPI SPI +#define SDCARD_CS_PIN 17 + +#define BUTTON_LEFT_PIN 10 +#define BUTTON_RIGHT_PIN 11 +#define BUTTON_PLAY_PIN 12 +#define BUTTON_HOME_PIN 13 + +#define I2S_BCK 20 +#define I2S_WS 21 +#define I2S_DATA 22 + +#define BATTERY_ADC_PIN 26 +#define VOLUME_PIN 27 +#define JACK_PIN 28 + +#define BTN_DEBOUNCE_MS 50 +#define COPIER_BUFFER_SIZE 512 + +#define HEADPHONE 0 +#define SPEAKER 1 + +#define is_menu 0 +#define is_play 1 +#define is_pause 2 + +// #define SPI_CLOCK SD_SCK_MHZ(2) +// #define MP3_MAX_OUTPUT_SIZE 1024 +// #define MP3_MAX_FRAME_SIZE 800 + +// #define MP3_MAX_OUTPUT_SIZE 1024 * 5 // 1024 * 5 +// #define MP3_MAX_FRAME_SIZE 3200 // 1600 +// #define I2S_BUFFER_SIZE 1024 + +/* end hardware config */ + +I2SStream i2s; +VolumeStream volumer(i2s); +EncodedAudioStream decoder(&volumer, new MP3DecoderHelix()); +File audioFile; +// StreamCopy copier(decoder, audioFile, COPIER_BUFFER_SIZE); +StreamCopy copier; + +Ewma smoother(0.01); // 0.1 : less smoothing // 0.01 : More smoothing - less prone to noise, but slower to detect changes + +int status = is_menu; + +Button2 button_home; +Button2 button_left; +Button2 button_right; +Button2 button_play; + +String currentpath = ""; + +int currentstory = 1; +int totalstories = 0; + +String stories[MAXSTORIES]; + +int volume = 0; +int lastVolume = 0; + +int output = HEADPHONE; +int lastOutput = HEADPHONE; + +bool led = true; + +void setup() +{ + pinMode(LED_BUILTIN, OUTPUT); + + blink(1); + + delay(100); + Serial.println("*************** Story Box start V3 ****************"); + delay(100); + + // logger + Serial.begin(115200); + AudioLogger::instance().begin(Serial, AudioLogger::Warning); + // AudioLogger::instance().begin(Serial, AudioLogger::Info); // use this for more logs + + SDFSConfig sdconfig; + sdconfig.setCSPin(SDCARD_CS_PIN); + SDFS.setConfig(sdconfig); + + if (!SDFS.begin()) + { + blink(5); + Serial.printf("Init sd failed\n"); + // SDFS.errorHalt(); + } + + // i2s + auto config = i2s.defaultConfig(TX_MODE); + config.pin_bck = I2S_BCK; + config.pin_ws = I2S_WS; + config.pin_data = I2S_DATA; + i2s.begin(config); + + // setup I2S based on sampling rate provided by decoder + decoder.setNotifyAudioChange(i2s); + decoder.begin(); + + // copier buffer size + copier.resize(COPIER_BUFFER_SIZE); + + // volume + // auto volume_config = volumer.defaultConfig(); + // volume_config.allow_boost = true; // this allows volume > 1.0 be careful with this setting + volumer.begin(config); // we need to provide the bits_per_sample and channels + // volumer.begin(volume_config); + volumer.setVolume(0.1); + + delay(100); + + // buttons + button_left.begin(BUTTON_LEFT_PIN); + button_left.setPressedHandler(handleTapLeft); + + button_right.begin(BUTTON_RIGHT_PIN); + button_right.setPressedHandler(handleTapRight); + + button_home.begin(BUTTON_HOME_PIN); + button_home.setPressedHandler(handleTapHome); + + button_play.begin(BUTTON_PLAY_PIN); + button_play.setPressedHandler(handleTapPlay); + + handleDirectoryChange(); + play("/intro.mp3"); + digitalWrite(LED_BUILTIN, HIGH); +} + +void blink(int times) +{ + delay(1000); + for (int i = 0; i < times; i++) + { + digitalWrite(LED_BUILTIN, HIGH); + delay(200); + digitalWrite(LED_BUILTIN, LOW); + delay(200); + } + delay(1000); +} + +void play(String filename) +{ + audioFile = SDFS.open(filename, "r"); + copier.begin(decoder, audioFile); + Serial.print("Play start "); + Serial.println(filename); +} + +void playmenu() +{ + status = is_menu; + String menu = "/menu.mp3"; + play(currentpath + '/' + stories[currentstory] + menu); +} + +void playstory() +{ + if (status == is_pause) + { + status = is_play; + return; + } + status = is_play; + play(currentpath + '/' + stories[currentstory] + "/story.mp3"); +} + +// currentpath +// currentstory = 1 .. int +// totalstories = int +// liste des dossier dans le dossier actuel -> tableau -> stories + +void debug() +{ + if (DEBUG) + { + Serial.print("Current path : "); + Serial.println(currentpath); + Serial.print("totalstories : "); + Serial.println(totalstories); + Serial.print("Current story : "); + Serial.println(currentstory); + Serial.println("Stories found : "); + for (int i = 0; i < totalstories; i++) + { + Serial.print("- "); + Serial.println(stories[i]); + } + if (status == is_play) + { + Serial.println("*** playing ****"); + } + + if (status == is_menu) + { + Serial.println("*** on menu ****"); + } + + if (status == is_pause) + { + Serial.println("*** paused ****"); + } + + handleTemperature(); + handleBattery(); + handleJack(); + + if (output == HEADPHONE) + { + Serial.println("Ouptut : headphone"); + } + + if (output == SPEAKER) + { + Serial.println("Ouptut : speaker"); + } + + Serial.print("Volume : "); + Serial.println(volume); + + Serial.println("-----------------"); + } +} + +void handleDirectoryChange() +{ + totalstories = 0; + Dir dir = SDFS.openDir(currentpath); + while (dir.next()) + { + if (dir.isDirectory()) + { + stories[totalstories] = dir.fileName(); + totalstories++; + } + } +} + +void handleTapLeft(Button2 &b) +{ + Serial.println("button left pressed"); + currentstory--; + if (currentstory < 0) + { + currentstory = totalstories - 1; + } + int i = 0; + + playmenu(); + debug(); +} + +void handleTapRight(Button2 &b) +{ + Serial.println("button right pressed"); + currentstory++; + if (currentstory >= totalstories) + { + currentstory = 0; + } + playmenu(); + debug(); +} + +void handleTapHome(Button2 &b) +{ + Serial.println("button home pressed"); + currentpath = ""; + handleDirectoryChange(); + debug(); +} + +void handleTapPlay(Button2 &b) +{ + Serial.println("button play pressed"); + if (status == is_play) + { + status = is_pause; + } + else + { + playstory(); + } + debug(); +} + +void handleBattery() +{ + float vsys = float(analogRead(29)) * 3.0 * 3.3 / 1024; + Serial.print("vsys : "); + Serial.println(vsys); + + float battery = float(analogRead(BATTERY_ADC_PIN)) * 2.0 * 3.3 / 1024 + 0.15; // the 0.15 is to acknowledge the voltage drop from the schotky diode + Serial.print("battery : "); + Serial.println(battery); +} + +void handleTemperature() +{ + int temperature = analogReadTemp(); + Serial.print("Temperature : "); + Serial.println(temperature); +} + +/** + * Reads the jack analog input 10 times, takes the highest signal, + * if < JACK_DETECTION_LEVEL it means a jack is connected, reduce max volume for headphones + * If > JACK_DETECTION_LEVEL it means a jack is not connected, we are in speaker mode, don't reduce volume + * + */ +void handleJack() +{ + int max = 0; + for (int i = 0; i < 10; i++) + { + int read = analogRead(JACK_PIN); + if (read > max) + { + max = read; + } + } + + // Serial.print("Jack max : "); + // Serial.println(max); + + if (max > JACK_DETECTION_LEVEL) + { + output = SPEAKER; + } + else + { + output = HEADPHONE; + } +} + +void handleVolume() +{ + volume = smoother.filter(analogRead(VOLUME_PIN)); + volume = map(volume, 0, 1024, 0, VOLUME_STEPS); + + if (volume != lastVolume || output != lastOutput) + { + lastVolume = volume; + lastOutput = output; + + if (output == HEADPHONE) + { + volumer.setVolume(float(map(volume, 0, VOLUME_STEPS, 0, MAX_HEADPHONE_VOLUME)) / 1024); + } + + if (output == SPEAKER) + { + volumer.setVolume(float(map(volume, 0, VOLUME_STEPS, 0, MAX_SPEAKER_VOLUME)) / 1024); + } + + Serial.print("Volume : "); + Serial.println(volume); + } +} + +void loop() +{ + + led = !led; + if (led) + { + digitalWrite(LED_BUILTIN, HIGH); + } + else + { + digitalWrite(LED_BUILTIN, LOW); + } + + button_left.loop(); + button_right.loop(); + button_home.loop(); + button_play.loop(); + + if (status == is_play || status == is_menu) + { + copier.copy(); + } + + handleVolume(); + handleJack(); +} diff --git a/arduino/storybox/storybox.ino.empty b/arduino/storybox/storybox.ino.empty new file mode 100644 index 0000000..cb9026b --- /dev/null +++ b/arduino/storybox/storybox.ino.empty @@ -0,0 +1,13 @@ +#include +#include +#include "AudioTools.h" +#include "AudioCodecs/CodecMP3Helix.h" +#include "Button2.h" + +void setup() +{ +} + +void loop() +{ +} \ No newline at end of file diff --git a/boitier/ElectronicsBox bigger.svg b/boitier/ElectronicsBox bigger.svg new file mode 100644 index 0000000..ac1e781 --- /dev/null +++ b/boitier/ElectronicsBox bigger.svg @@ -0,0 +1,80 @@ + + + +ElectronicsBox + + +Box - ElectronicsBox +2024-03-27 11:09:08 +http://www.festi.info/boxes.py/ElectronicsBox?FingerJoint_angle=90.0&FingerJoint_style=rectangular&FingerJoint_surroundingspaces=2.0&FingerJoint_bottom_lip=0.0&FingerJoint_edge_width=1.0&FingerJoint_extra_length=0.0&FingerJoint_finger=2.0&FingerJoint_play=0.0&FingerJoint_space=2.0&FingerJoint_width=1.0&x=180&y=100&h=33&outside=0&triangle=20&d1=1&d2=2&d3=2&outsidemounts=0&holedist=7.0&thickness=3.5&format=svg&tabs=0.0&qr_code=0&debug=0&labels=0&labels=1&reference=100&inner_corners=loop&burn=0.15&language=fr&render=1 +http://www.festi.info/boxes.py/ElectronicsBox?x=180&h=33&outside=0&triangle=20&d1=1&d2=2&d3=2&outsidemounts=0&thickness=3.5&burn=0.15 +Closed box with screw on top and mounting holes + +Created with Boxes.py (https://festi.info/boxes.py) +Command line: boxes ElectronicsBox --FingerJoint_angle=90.0 --FingerJoint_style=rectangular --FingerJoint_surroundingspaces=2.0 --FingerJoint_bottom_lip=0.0 --FingerJoint_edge_width=1.0 --FingerJoint_extra_length=0.0 --FingerJoint_finger=2.0 --FingerJoint_play=0.0 --FingerJoint_space=2.0 --FingerJoint_width=1.0 --x=180 --y=100 --h=33 --outside=0 --triangle=20 --d1=1 --d2=2 --d3=2 --outsidemounts=0 --holedist=7.0 --thickness=3.5 --format=svg --tabs=0.0 --qr_code=0 --debug=0 --labels=0 --labels=1 --reference=100 --inner_corners=loop --burn=0.15 +Command line short: boxes ElectronicsBox --x=180 --h=33 --outside=0 --triangle=20 --d1=1 --d2=2 --d3=2 --outsidemounts=0 --thickness=3.5 --burn=0.15 +Url: http://www.festi.info/boxes.py/ElectronicsBox?FingerJoint_angle=90.0&FingerJoint_style=rectangular&FingerJoint_surroundingspaces=2.0&FingerJoint_bottom_lip=0.0&FingerJoint_edge_width=1.0&FingerJoint_extra_length=0.0&FingerJoint_finger=2.0&FingerJoint_play=0.0&FingerJoint_space=2.0&FingerJoint_width=1.0&x=180&y=100&h=33&outside=0&triangle=20&d1=1&d2=2&d3=2&outsidemounts=0&holedist=7.0&thickness=3.5&format=svg&tabs=0.0&qr_code=0&debug=0&labels=0&labels=1&reference=100&inner_corners=loop&burn=0.15&language=fr&render=1 +Url short: http://www.festi.info/boxes.py/ElectronicsBox?x=180&h=33&outside=0&triangle=20&d1=1&d2=2&d3=2&outsidemounts=0&thickness=3.5&burn=0.15 +SettingsUrl: http://www.festi.info/boxes.py/ElectronicsBox?FingerJoint_angle=90.0&FingerJoint_style=rectangular&FingerJoint_surroundingspaces=2.0&FingerJoint_bottom_lip=0.0&FingerJoint_edge_width=1.0&FingerJoint_extra_length=0.0&FingerJoint_finger=2.0&FingerJoint_play=0.0&FingerJoint_space=2.0&FingerJoint_width=1.0&x=180&y=100&h=33&outside=0&triangle=20&d1=1&d2=2&d3=2&outsidemounts=0&holedist=7.0&thickness=3.5&format=svg&tabs=0.0&qr_code=0&debug=0&labels=0&labels=1&reference=100&inner_corners=loop&burn=0.15&language=fr +SettingsUrl short: http://www.festi.info/boxes.py/ElectronicsBox?x=180&h=33&outside=0&triangle=20&d1=1&d2=2&d3=2&outsidemounts=0&thickness=3.5&burn=0.15 + + + + + 100.00mm, burn:0.15mm + + + + + Wall 1 + + + + + Wall 2 + + + + + Wall 4 + + + + + Wall 3 + + + + Bottom + + + + + + + Top + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/boitier/ElectronicsBox.svg b/boitier/ElectronicsBox.svg new file mode 100644 index 0000000..58a5b9a --- /dev/null +++ b/boitier/ElectronicsBox.svg @@ -0,0 +1,1083 @@ + + + +ElectronicsBox + + +Box - ElectronicsBox +2024-03-26 09:18:25 +http://www.festi.info/boxes.py/ElectronicsBox?FingerJoint_angle=90.0&FingerJoint_style=rectangular&FingerJoint_surroundingspaces=2.0&FingerJoint_bottom_lip=0.0&FingerJoint_edge_width=1.0&FingerJoint_extra_length=0.0&FingerJoint_finger=2.0&FingerJoint_play=0.0&FingerJoint_space=2.0&FingerJoint_width=1.0&x=140&y=80&h=50&outside=0&triangle=25.0&d1=1&d2=2&d3=2&outsidemounts=0&holedist=7.0&thickness=3.8&format=svg&tabs=0.0&qr_code=0&qr_code=1&debug=0&labels=0&labels=1&reference=100&inner_corners=loop&burn=0.1&language=fr&render=1 +http://www.festi.info/boxes.py/ElectronicsBox?x=140&y=80&h=50&outside=0&d1=1&d2=2&d3=2&outsidemounts=0&thickness=3.8 +Closed box with screw on top and mounting holes + +Created with Boxes.py (https://festi.info/boxes.py) +Command line: boxes ElectronicsBox --FingerJoint_angle=90.0 --FingerJoint_style=rectangular --FingerJoint_surroundingspaces=2.0 --FingerJoint_bottom_lip=0.0 --FingerJoint_edge_width=1.0 --FingerJoint_extra_length=0.0 --FingerJoint_finger=2.0 --FingerJoint_play=0.0 --FingerJoint_space=2.0 --FingerJoint_width=1.0 --x=140 --y=80 --h=50 --outside=0 --triangle=25.0 --d1=1 --d2=2 --d3=2 --outsidemounts=0 --holedist=7.0 --thickness=3.8 --format=svg --tabs=0.0 --qr_code=0 --qr_code=1 --debug=0 --labels=0 --labels=1 --reference=100 --inner_corners=loop --burn=0.1 +Command line short: boxes ElectronicsBox --x=140 --y=80 --h=50 --outside=0 --d1=1 --d2=2 --d3=2 --outsidemounts=0 --thickness=3.8 --qr_code=0 --qr_code=1 +Url: http://www.festi.info/boxes.py/ElectronicsBox?FingerJoint_angle=90.0&FingerJoint_style=rectangular&FingerJoint_surroundingspaces=2.0&FingerJoint_bottom_lip=0.0&FingerJoint_edge_width=1.0&FingerJoint_extra_length=0.0&FingerJoint_finger=2.0&FingerJoint_play=0.0&FingerJoint_space=2.0&FingerJoint_width=1.0&x=140&y=80&h=50&outside=0&triangle=25.0&d1=1&d2=2&d3=2&outsidemounts=0&holedist=7.0&thickness=3.8&format=svg&tabs=0.0&qr_code=0&qr_code=1&debug=0&labels=0&labels=1&reference=100&inner_corners=loop&burn=0.1&language=fr&render=1 +Url short: http://www.festi.info/boxes.py/ElectronicsBox?x=140&y=80&h=50&outside=0&d1=1&d2=2&d3=2&outsidemounts=0&thickness=3.8 +SettingsUrl: http://www.festi.info/boxes.py/ElectronicsBox?FingerJoint_angle=90.0&FingerJoint_style=rectangular&FingerJoint_surroundingspaces=2.0&FingerJoint_bottom_lip=0.0&FingerJoint_edge_width=1.0&FingerJoint_extra_length=0.0&FingerJoint_finger=2.0&FingerJoint_play=0.0&FingerJoint_space=2.0&FingerJoint_width=1.0&x=140&y=80&h=50&outside=0&triangle=25.0&d1=1&d2=2&d3=2&outsidemounts=0&holedist=7.0&thickness=3.8&format=svg&tabs=0.0&qr_code=0&qr_code=1&debug=0&labels=0&labels=1&reference=100&inner_corners=loop&burn=0.1&language=fr +SettingsUrl short: http://www.festi.info/boxes.py/ElectronicsBox?x=140&y=80&h=50&outside=0&d1=1&d2=2&d3=2&outsidemounts=0&thickness=3.8 + + + + + 100.00mm, burn:0.10mm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + http://www.festi.info/boxes.py/ElectronicsBox?x=140&y=80&h=50&outside=0&d1=1&d2=2&d3=2&outsidemounts=0&thickness=3.8 + + + + + Wall 1 + + + + + Wall 2 + + + + + Wall 4 + + + + + Wall 3 + + + + Bottom + + + + + + + Top + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/boitier/HolePattern.svg b/boitier/HolePattern.svg new file mode 100644 index 0000000..1958cb8 --- /dev/null +++ b/boitier/HolePattern.svg @@ -0,0 +1,90 @@ + + + +HolePattern + + +Holes - HolePattern +2024-03-26 09:44:15 +http://www.festi.info/boxes.py/HolePattern?fillHoles_bar_length=50&fillHoles_fill_pattern=square&fillHoles_hole_max_radius=2&fillHoles_hole_min_radius=2&fillHoles_hole_style=round&fillHoles_max_random=1000&fillHoles_space_between_holes=2&fillHoles_space_to_border=2&x=60&y=50&shape=hexagon&thickness=3.0&format=svg&tabs=0.0&qr_code=0&debug=0&labels=0&labels=1&reference=100&inner_corners=loop&burn=0.1&language=fr&render=1 +http://www.festi.info/boxes.py/HolePattern?fillHoles_fill_pattern=square&fillHoles_hole_max_radius=2&fillHoles_hole_min_radius=2&fillHoles_space_between_holes=2&fillHoles_space_to_border=2&x=60&y=50&shape=hexagon +Generate hole patterns in different simple shapes + +Created with Boxes.py (https://festi.info/boxes.py) +Command line: boxes HolePattern --fillHoles_bar_length=50 --fillHoles_fill_pattern=square --fillHoles_hole_max_radius=2 --fillHoles_hole_min_radius=2 --fillHoles_hole_style=round --fillHoles_max_random=1000 --fillHoles_space_between_holes=2 --fillHoles_space_to_border=2 --x=60 --y=50 --shape=hexagon --thickness=3.0 --format=svg --tabs=0.0 --qr_code=0 --debug=0 --labels=0 --labels=1 --reference=100 --inner_corners=loop --burn=0.1 +Command line short: boxes HolePattern --fillHoles_fill_pattern=square --fillHoles_hole_max_radius=2 --fillHoles_hole_min_radius=2 --fillHoles_space_between_holes=2 --fillHoles_space_to_border=2 --x=60 --y=50 --shape=hexagon +Url: http://www.festi.info/boxes.py/HolePattern?fillHoles_bar_length=50&fillHoles_fill_pattern=square&fillHoles_hole_max_radius=2&fillHoles_hole_min_radius=2&fillHoles_hole_style=round&fillHoles_max_random=1000&fillHoles_space_between_holes=2&fillHoles_space_to_border=2&x=60&y=50&shape=hexagon&thickness=3.0&format=svg&tabs=0.0&qr_code=0&debug=0&labels=0&labels=1&reference=100&inner_corners=loop&burn=0.1&language=fr&render=1 +Url short: http://www.festi.info/boxes.py/HolePattern?fillHoles_fill_pattern=square&fillHoles_hole_max_radius=2&fillHoles_hole_min_radius=2&fillHoles_space_between_holes=2&fillHoles_space_to_border=2&x=60&y=50&shape=hexagon +SettingsUrl: http://www.festi.info/boxes.py/HolePattern?fillHoles_bar_length=50&fillHoles_fill_pattern=square&fillHoles_hole_max_radius=2&fillHoles_hole_min_radius=2&fillHoles_hole_style=round&fillHoles_max_random=1000&fillHoles_space_between_holes=2&fillHoles_space_to_border=2&x=60&y=50&shape=hexagon&thickness=3.0&format=svg&tabs=0.0&qr_code=0&debug=0&labels=0&labels=1&reference=100&inner_corners=loop&burn=0.1&language=fr +SettingsUrl short: http://www.festi.info/boxes.py/HolePattern?fillHoles_fill_pattern=square&fillHoles_hole_max_radius=2&fillHoles_hole_min_radius=2&fillHoles_space_between_holes=2&fillHoles_space_to_border=2&x=60&y=50&shape=hexagon + + + + + 100.00mm, burn:0.10mm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/boitier/HolePatterntight.svg b/boitier/HolePatterntight.svg new file mode 100644 index 0000000..a5be3f6 --- /dev/null +++ b/boitier/HolePatterntight.svg @@ -0,0 +1,204 @@ + + + +HolePattern + + +Holes - HolePattern +2024-03-26 10:17:17 +http://www.festi.info/boxes.py/HolePattern?fillHoles_bar_length=50&fillHoles_fill_pattern=square&fillHoles_hole_max_radius=1&fillHoles_hole_min_radius=1&fillHoles_hole_style=round&fillHoles_max_random=1000&fillHoles_space_between_holes=1.5&fillHoles_space_to_border=1.5&x=60&y=50&shape=hexagon&thickness=3.0&format=svg&tabs=0.0&qr_code=0&debug=0&labels=0&labels=1&reference=100&inner_corners=loop&burn=0.1&language=fr&render=1 +http://www.festi.info/boxes.py/HolePattern?fillHoles_fill_pattern=square&fillHoles_hole_max_radius=1&fillHoles_hole_min_radius=1&fillHoles_space_between_holes=1.5&fillHoles_space_to_border=1.5&x=60&y=50&shape=hexagon +Generate hole patterns in different simple shapes + +Created with Boxes.py (https://festi.info/boxes.py) +Command line: boxes HolePattern --fillHoles_bar_length=50 --fillHoles_fill_pattern=square --fillHoles_hole_max_radius=1 --fillHoles_hole_min_radius=1 --fillHoles_hole_style=round --fillHoles_max_random=1000 --fillHoles_space_between_holes=1.5 --fillHoles_space_to_border=1.5 --x=60 --y=50 --shape=hexagon --thickness=3.0 --format=svg --tabs=0.0 --qr_code=0 --debug=0 --labels=0 --labels=1 --reference=100 --inner_corners=loop --burn=0.1 +Command line short: boxes HolePattern --fillHoles_fill_pattern=square --fillHoles_hole_max_radius=1 --fillHoles_hole_min_radius=1 --fillHoles_space_between_holes=1.5 --fillHoles_space_to_border=1.5 --x=60 --y=50 --shape=hexagon +Url: http://www.festi.info/boxes.py/HolePattern?fillHoles_bar_length=50&fillHoles_fill_pattern=square&fillHoles_hole_max_radius=1&fillHoles_hole_min_radius=1&fillHoles_hole_style=round&fillHoles_max_random=1000&fillHoles_space_between_holes=1.5&fillHoles_space_to_border=1.5&x=60&y=50&shape=hexagon&thickness=3.0&format=svg&tabs=0.0&qr_code=0&debug=0&labels=0&labels=1&reference=100&inner_corners=loop&burn=0.1&language=fr&render=1 +Url short: http://www.festi.info/boxes.py/HolePattern?fillHoles_fill_pattern=square&fillHoles_hole_max_radius=1&fillHoles_hole_min_radius=1&fillHoles_space_between_holes=1.5&fillHoles_space_to_border=1.5&x=60&y=50&shape=hexagon +SettingsUrl: http://www.festi.info/boxes.py/HolePattern?fillHoles_bar_length=50&fillHoles_fill_pattern=square&fillHoles_hole_max_radius=1&fillHoles_hole_min_radius=1&fillHoles_hole_style=round&fillHoles_max_random=1000&fillHoles_space_between_holes=1.5&fillHoles_space_to_border=1.5&x=60&y=50&shape=hexagon&thickness=3.0&format=svg&tabs=0.0&qr_code=0&debug=0&labels=0&labels=1&reference=100&inner_corners=loop&burn=0.1&language=fr +SettingsUrl short: http://www.festi.info/boxes.py/HolePattern?fillHoles_fill_pattern=square&fillHoles_hole_max_radius=1&fillHoles_hole_min_radius=1&fillHoles_space_between_holes=1.5&fillHoles_space_to_border=1.5&x=60&y=50&shape=hexagon + + + + + 100.00mm, burn:0.10mm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/boitier/boite test haut parleurs.svg b/boitier/boite test haut parleurs.svg new file mode 100644 index 0000000..85a36ae --- /dev/null +++ b/boitier/boite test haut parleurs.svg @@ -0,0 +1,890 @@ + + + + + + ElectronicsBox + + + + ElectronicsBox + 2024-05-22 12:48:52 + http://boxes.hackerspace-bamberg.de/boxes.py/ElectronicsBox?FingerJoint_angle=90.0&FingerJoint_style=rectangular&FingerJoint_surroundingspaces=2.0&FingerJoint_bottom_lip=0.0&FingerJoint_edge_width=1.0&FingerJoint_extra_length=0.0&FingerJoint_finger=2.0&FingerJoint_play=0.0&FingerJoint_space=2.0&FingerJoint_width=1.0&x=100.0&y=100.0&h=50&outside=0&triangle=25.0&d1=2.0&d2=3.0&d3=3.0&outsidemounts=0&holedist=7.0&thickness=4.1&format=svg&tabs=0.0&qr_code=0&debug=0&labels=0&labels=1&reference=100.0&inner_corners=loop&burn=0.1&language=fr&render=2 + http://boxes.hackerspace-bamberg.de/boxes.py/ElectronicsBox?h=50&outside=0&outsidemounts=0&thickness=4.1 + Closed box with screw on top and mounting holes + +Created with Boxes.py (https://festi.info/boxes.py) +Command line: boxes ElectronicsBox --FingerJoint_angle=90.0 --FingerJoint_style=rectangular --FingerJoint_surroundingspaces=2.0 --FingerJoint_bottom_lip=0.0 --FingerJoint_edge_width=1.0 --FingerJoint_extra_length=0.0 --FingerJoint_finger=2.0 --FingerJoint_play=0.0 --FingerJoint_space=2.0 --FingerJoint_width=1.0 --x=100.0 --y=100.0 --h=50 --outside=0 --triangle=25.0 --d1=2.0 --d2=3.0 --d3=3.0 --outsidemounts=0 --holedist=7.0 --thickness=4.1 --format=svg --tabs=0.0 --qr_code=0 --debug=0 --labels=0 --labels=1 --reference=100.0 --inner_corners=loop --burn=0.1 +Command line short: boxes ElectronicsBox --h=50 --outside=0 --outsidemounts=0 --thickness=4.1 +Url: http://boxes.hackerspace-bamberg.de/boxes.py/ElectronicsBox?FingerJoint_angle=90.0&FingerJoint_style=rectangular&FingerJoint_surroundingspaces=2.0&FingerJoint_bottom_lip=0.0&FingerJoint_edge_width=1.0&FingerJoint_extra_length=0.0&FingerJoint_finger=2.0&FingerJoint_play=0.0&FingerJoint_space=2.0&FingerJoint_width=1.0&x=100.0&y=100.0&h=50&outside=0&triangle=25.0&d1=2.0&d2=3.0&d3=3.0&outsidemounts=0&holedist=7.0&thickness=4.1&format=svg&tabs=0.0&qr_code=0&debug=0&labels=0&labels=1&reference=100.0&inner_corners=loop&burn=0.1&language=fr&render=2 +Url short: http://boxes.hackerspace-bamberg.de/boxes.py/ElectronicsBox?h=50&outside=0&outsidemounts=0&thickness=4.1 +SettingsUrl: http://boxes.hackerspace-bamberg.de/boxes.py/ElectronicsBox?FingerJoint_angle=90.0&FingerJoint_style=rectangular&FingerJoint_surroundingspaces=2.0&FingerJoint_bottom_lip=0.0&FingerJoint_edge_width=1.0&FingerJoint_extra_length=0.0&FingerJoint_finger=2.0&FingerJoint_play=0.0&FingerJoint_space=2.0&FingerJoint_width=1.0&x=100.0&y=100.0&h=50&outside=0&triangle=25.0&d1=2.0&d2=3.0&d3=3.0&outsidemounts=0&holedist=7.0&thickness=4.1&format=svg&tabs=0.0&qr_code=0&debug=0&labels=0&labels=1&reference=100.0&inner_corners=loop&burn=0.1&language=fr&render=2 +SettingsUrl short: http://boxes.hackerspace-bamberg.de/boxes.py/ElectronicsBox?h=50&outside=0&outsidemounts=0&thickness=4.1 + + + + + + + 100.0mm, burn:0.10mm + + + + + Wall 1 + + + + + + Wall 2 + + + + + Wall 4 + + + + + Wall 3 + + + + + Bottom + + + + + + + + Top + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boitier/boites festy.txt b/boitier/boites festy.txt new file mode 100644 index 0000000..1a9d546 --- /dev/null +++ b/boitier/boites festy.txt @@ -0,0 +1,5 @@ +https://www.festi.info/boxes.py/ElectronicsBox?FingerJoint_angle=90.0&FingerJoint_style=rectangular&FingerJoint_surroundingspaces=2.0&FingerJoint_bottom_lip=0.0&FingerJoint_edge_width=1.0&FingerJoint_extra_length=0.0&FingerJoint_finger=2.0&FingerJoint_play=0.0&FingerJoint_space=2.0&FingerJoint_width=1.0&x=180&y=100&h=33&outside=0&triangle=20&d1=1&d2=2&d3=2&outsidemounts=0&holedist=7.0&thickness=3.5&format=svg&tabs=0.0&qr_code=0&debug=0&labels=0&labels=1&reference=100&inner_corners=loop&burn=0.15&language=fr&render=0 + + + + diff --git a/boitier/proto boite v1.svg b/boitier/proto boite v1.svg new file mode 100644 index 0000000..d30165c --- /dev/null +++ b/boitier/proto boite v1.svg @@ -0,0 +1,1938 @@ + +ElectronicsBoxElectronicsBox2024-03-26 09:18:25http://www.festi.info/boxes.py/ElectronicsBox?FingerJoint_angle=90.0&FingerJoint_style=rectangular&FingerJoint_surroundingspaces=2.0&FingerJoint_bottom_lip=0.0&FingerJoint_edge_width=1.0&FingerJoint_extra_length=0.0&FingerJoint_finger=2.0&FingerJoint_play=0.0&FingerJoint_space=2.0&FingerJoint_width=1.0&x=140&y=80&h=50&outside=0&triangle=25.0&d1=1&d2=2&d3=2&outsidemounts=0&holedist=7.0&thickness=3.8&format=svg&tabs=0.0&qr_code=0&qr_code=1&debug=0&labels=0&labels=1&reference=100&inner_corners=loop&burn=0.1&language=fr&render=1http://www.festi.info/boxes.py/ElectronicsBox?x=140&y=80&h=50&outside=0&d1=1&d2=2&d3=2&outsidemounts=0&thickness=3.8Closed box with screw on top and mounting holes + +Created with Boxes.py (https://festi.info/boxes.py) +Command line: boxes ElectronicsBox --FingerJoint_angle=90.0 --FingerJoint_style=rectangular --FingerJoint_surroundingspaces=2.0 --FingerJoint_bottom_lip=0.0 --FingerJoint_edge_width=1.0 --FingerJoint_extra_length=0.0 --FingerJoint_finger=2.0 --FingerJoint_play=0.0 --FingerJoint_space=2.0 --FingerJoint_width=1.0 --x=140 --y=80 --h=50 --outside=0 --triangle=25.0 --d1=1 --d2=2 --d3=2 --outsidemounts=0 --holedist=7.0 --thickness=3.8 --format=svg --tabs=0.0 --qr_code=0 --qr_code=1 --debug=0 --labels=0 --labels=1 --reference=100 --inner_corners=loop --burn=0.1 +Command line short: boxes ElectronicsBox --x=140 --y=80 --h=50 --outside=0 --d1=1 --d2=2 --d3=2 --outsidemounts=0 --thickness=3.8 --qr_code=0 --qr_code=1 +Url: http://www.festi.info/boxes.py/ElectronicsBox?FingerJoint_angle=90.0&FingerJoint_style=rectangular&FingerJoint_surroundingspaces=2.0&FingerJoint_bottom_lip=0.0&FingerJoint_edge_width=1.0&FingerJoint_extra_length=0.0&FingerJoint_finger=2.0&FingerJoint_play=0.0&FingerJoint_space=2.0&FingerJoint_width=1.0&x=140&y=80&h=50&outside=0&triangle=25.0&d1=1&d2=2&d3=2&outsidemounts=0&holedist=7.0&thickness=3.8&format=svg&tabs=0.0&qr_code=0&qr_code=1&debug=0&labels=0&labels=1&reference=100&inner_corners=loop&burn=0.1&language=fr&render=1 +Url short: http://www.festi.info/boxes.py/ElectronicsBox?x=140&y=80&h=50&outside=0&d1=1&d2=2&d3=2&outsidemounts=0&thickness=3.8 +SettingsUrl: http://www.festi.info/boxes.py/ElectronicsBox?FingerJoint_angle=90.0&FingerJoint_style=rectangular&FingerJoint_surroundingspaces=2.0&FingerJoint_bottom_lip=0.0&FingerJoint_edge_width=1.0&FingerJoint_extra_length=0.0&FingerJoint_finger=2.0&FingerJoint_play=0.0&FingerJoint_space=2.0&FingerJoint_width=1.0&x=140&y=80&h=50&outside=0&triangle=25.0&d1=1&d2=2&d3=2&outsidemounts=0&holedist=7.0&thickness=3.8&format=svg&tabs=0.0&qr_code=0&qr_code=1&debug=0&labels=0&labels=1&reference=100&inner_corners=loop&burn=0.1&language=fr +SettingsUrl short: http://www.festi.info/boxes.py/ElectronicsBox?x=140&y=80&h=50&outside=0&d1=1&d2=2&d3=2&outsidemounts=0&thickness=3.8 +