Jump to content

Ghostchips 1920-26 ford T bucket (of rust)


Recommended Posts

  • 4 months later...
  • Replies 69
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

  • 1 year later...

Hood tie down strap made from a leather belt.  The belt is so long it forms a loop for someone 3 times my size.  Could wrap that around my waist 3 times before it met the first belt hole, and it has a functional lock in it.  Why would it have a lock?

 

ePK5WL4.jpg

 

 

So i don't know if i should start a technical thread on "How to make trembler coils" as mine are toast and one of the borrowed ones died today. Never successfully made an ignition coil before, i think i'll need help of the electrical gurus on here.

  • Like 7
  • Thanks 1
Link to comment
Share on other sites

  • 4 weeks later...
  • 6 months later...
  • 2 months later...
  • 2 months later...
  • 5 months later...
  • 5 months later...
  • 4 weeks later...
  • 3 weeks later...
  • 2 weeks later...
  • 2 weeks later...

Picture-less update.

While i will still need to dial in the auto-advance curve (the orig' relied on a combination of moving a lever to a basic range, and the magnets on the flywheel ramping up the speed of the points opening) it has a notable improvement in fuel economy, partly due to being able to wind the fuel mixture screw in 1/16th of a turn & have the same performance.
It's like having the magneto set perfectly.  But requires a battery.

  • Like 6
  • Thanks 1
Link to comment
Share on other sites

  • 5 weeks later...

I can wind the mixture screw in 1/8th and not melt the pistons.

i also made a music player for summer.


basicMP3.jpg.bf623a3b1594e75e43dd165c6b567c14.jpg

 

The first one, had no support for remembering where it stopped playing when it was turned off & i didn't want to stress the EEPROM by writing to it every time you changed a song.
So i made this hilarious work around.
254766597_basicMP32.jpg.cfbb7b7db618b47e861bd8a0ef0ce538.jpg

The first one, had no support for remembering where it stopped playing when it was turned off & i didn't want to stress the EEPROM by writing to it every time you changed a song.
So i made this hilarious work around.
Ultra capacitors running the player for a few seconds after it is turned off.

/***************************************************
 * A basic MP3 player for a car, that was never designed for a radio.
 * connect to an amplifier for enhanced sound.  Anything better than the single MOSFET i used should be fine.
 * in this version i attempted to overcome its habit of not playing the next track, but i don't know how to read the 'Finished playing' from the serial... 
 * I derived this code from ...
 * 
 DFPlayer - A Mini MP3 Player For Arduino
 <https://www.dfrobot.com/index.php?route=product/product&product_id=1121>

 ***************************************************
 This example shows the all the function of library for DFPlayer.

 Created 2016-12-07
 By [Angelo qiao](Angelo.qiao@dfrobot.com)

 GNU Lesser General Public License.
 See <http://www.gnu.org/licenses/> for details.
 All above must be included in any redistribution
 ****************************************************/

/***********Notice and Trouble shooting***************
 1.Connection and Diagram can be found here
<https://www.dfrobot.com/wiki/index.php/DFPlayer_Mini_SKU:DFR0299#Connection_Diagram>
 2.This code is tested on Arduino Uno, Leonardo, Mega boards.
 ****************************************************/

#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

# define ACTIVATED LOW

SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);
int buttonPause = 3;
int buttonVolPlus = 4;
int buttonVolMinus = 2;
int buttonNext = 6;
int buttonPrev = 7;
int buttonFolderNext = 8;
int buttonFolderPrev = 5;
int theReadStatus = 0;
long unsigned theReadStatusTimer = 0;
int currentFileNumber = 1;
int busyReadPin = A1;
int readCurrentFileNumber(uint8_t device);
long unsigned currentMillis = 0;
int thisChar;

boolean isPlaying = true;

int trackCount = 0;   
int oldtrackCount = 0;     
int folderCount = 0;   
int oldfolderCount = 0;

String inputString = "";         // a String to hold incoming data
bool stringComplete = false;  // whether the string is complete

void setup()
{

  
# define Start_Byte 0x7E
# define Version_Byte 0xFF
# define Command_Length 0x06
# define End_Byte 0xEF
# define Acknowledge 0x00 //Returns info with command 0x41 [0x01: info, 0x00: no info]

  pinMode(buttonPause, INPUT);
  digitalWrite(buttonPause,HIGH);

  pinMode(buttonVolPlus, INPUT);
   digitalWrite(buttonVolPlus,HIGH);

  pinMode(buttonVolMinus, INPUT);
  digitalWrite(buttonVolMinus,HIGH);

  pinMode(buttonNext, INPUT);
  digitalWrite(buttonNext,HIGH);

  pinMode(buttonPrev, INPUT);
  digitalWrite(buttonPrev,HIGH);

  pinMode(buttonFolderNext, INPUT);
  digitalWrite(buttonFolderNext,HIGH);

  pinMode(buttonFolderPrev, INPUT);
  digitalWrite(buttonFolderPrev,HIGH);

  pinMode(busyReadPin, INPUT);
  digitalWrite(busyReadPin,LOW);

  mySoftwareSerial.begin(9600);
  Serial.begin(9600);
  
    while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  inputString.reserve(200);   // reserve 200 bytes for the inputString:
  
  Serial.println();
  Serial.println(F("DFRobot DFPlayer Mini Demo"));
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));

  if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial to communicate with mp3.
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while(true);
  }
  Serial.println(F("DFPlayer Mini online."));

  myDFPlayer.setTimeOut(500); //Set serial communictaion time out 500ms

  //----Set volume----
  myDFPlayer.volume(05);  //Set volume value (0~30).
  myDFPlayer.volumeUp(); //Volume Up
  myDFPlayer.volumeDown(); //Volume Down
  myDFPlayer.play(1);

  //----Set different EQ----
  myDFPlayer.EQ(DFPLAYER_EQ_NORMAL);
//  myDFPlayer.EQ(DFPLAYER_EQ_POP);
//  myDFPlayer.EQ(DFPLAYER_EQ_ROCK);
//  myDFPlayer.EQ(DFPLAYER_EQ_JAZZ);
//  myDFPlayer.EQ(DFPLAYER_EQ_CLASSIC);
//  myDFPlayer.EQ(DFPLAYER_EQ_BASS);

  //----Set device we use SD as default----
//  myDFPlayer.outputDevice(DFPLAYER_DEVICE_U_DISK);
  myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD);
//  myDFPlayer.outputDevice(DFPLAYER_DEVICE_AUX);
//  myDFPlayer.outputDevice(DFPLAYER_DEVICE_SLEEP);
//  myDFPlayer.outputDevice(DFPLAYER_DEVICE_FLASH);

  //----Mp3 control----
//  myDFPlayer.sleep();     //sleep
//  myDFPlayer.reset();     //Reset the module
//  myDFPlayer.enableDAC();  //Enable On-chip DAC
//  myDFPlayer.disableDAC();  //Disable On-chip DAC
//  myDFPlayer.outputSetting(true, 15); //output setting, enable the output and set the gain to 15


  //----Read imformation----
  Serial.println(myDFPlayer.readState()); //read mp3 state
  Serial.println(myDFPlayer.readVolume()); //read current volume
  Serial.println(myDFPlayer.readEQ()); //read EQ setting
  Serial.println(myDFPlayer.readFileCounts()); //read all file counts in SD card
  Serial.println(myDFPlayer.readCurrentFileNumber()); //read current play file number
  Serial.println(myDFPlayer.readFileCountsInFolder(3)); //read fill counts in folder SD:/03

  isPlaying = true;
  myDFPlayer.enableLoopAll();
}

void loop()
{
 if (digitalRead(buttonPause) == ACTIVATED)
  {
    if(isPlaying)
    {
      Serial.print( " Paused " );
      delay(20);
      myDFPlayer.pause();
      isPlaying = false;
    }
    else
    {
      Serial.print( " Play " );
      delay(20);
      isPlaying = true;
      myDFPlayer.start();
    }
  }
  delay(20);

 if (digitalRead(buttonVolPlus) == ACTIVATED)
  {
    if(isPlaying)
    {
      Serial.print( " Vol-Up " );
      myDFPlayer.volumeUp();
      delay(10);
    }
  }

  if (digitalRead(buttonVolMinus) == ACTIVATED)
  {
      Serial.print( " Vol-Down " );
      myDFPlayer.volumeDown();
      delay(10);
  }

 if (digitalRead(buttonNext) == ACTIVATED)
  {
    if(isPlaying)
    {
      Serial.print( " Button Next " );
      trackCount++;
      myDFPlayer.next();
      delay(20);
    }
  }

  if (digitalRead(buttonPrev) == ACTIVATED)
  {
    if(isPlaying)
    {
      Serial.print( " Button Prev' " );
      myDFPlayer.previous();
      trackCount--;
      delay(20);
    }
  }

 if (digitalRead(buttonFolderNext) == ACTIVATED)
  {
    if(isPlaying)
    {
      Serial.print( " Button folder+ " );
      folderCount++;
      Serial.print(folderCount);
      folderChange();
      delay(20);
    }
  }

  if (digitalRead(buttonFolderPrev) == ACTIVATED)
  {
    if(isPlaying)
    {
      Serial.print( " Button folder- " );
      folderCount--;
      Serial.print(folderCount);
      folderChange();
      delay(20);
    }
  }

  if (myDFPlayer.available())
  {
    printDetail(myDFPlayer.readType(), myDFPlayer.read()); //Print the detail message from DFPlayer to handle different errors and states.
  }
  while (myDFPlayer.available())
  {
    char inChar = ((char)(myDFPlayer.read()));                    //This method is a work-around for me being too dumb.
    Serial.print(myDFPlayer.readType(), myDFPlayer.read());       //I'm too dumb to figure out ho to read the "play finished" output as a string?
    if (inChar != 0)                                              //So i came up with this, Disgusting! it's just using any data while playing to 'auto-next'.
        if(isPlaying)                                             //Even interference from a spark plug could trigger this.  Shield your wires?
        {
         Serial.print( " Auto-Button Next " );
         trackCount++;
         myDFPlayer.next();
         delay(20);
         inChar = 0;
        }
  }
  
  delay(120);
}

void folderChange()
{
  if (folderCount == 1) {
    myDFPlayer.play((5));
    Serial.print(" 5 ");
  }
  else if (folderCount == 2) {
    myDFPlayer.play((10 + trackCount));
    Serial.print(" 10 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 3) {
    myDFPlayer.play((15 + trackCount));
    Serial.print(" 15 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 4) {
    myDFPlayer.play((20 + trackCount));
    Serial.print(" 20 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 5) {
    myDFPlayer.play((25 + trackCount));
    Serial.print(" 25 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 6) {
    myDFPlayer.play((30 + trackCount));
    Serial.print(" 30 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 7) {
    myDFPlayer.play((35 + trackCount));
    Serial.print(" 35 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 8) {
    myDFPlayer.play((40 + trackCount));
    Serial.print(" 40 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 9) {
    myDFPlayer.play((45 + trackCount));
    Serial.print(" 45 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 10) {
    myDFPlayer.play((50 + trackCount));
    Serial.print(" 50 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 11) {
    myDFPlayer.play((55 + trackCount));
    Serial.print(" 55 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 12) {
    myDFPlayer.play((60 + trackCount));
    Serial.print(" 60 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 13) {
    myDFPlayer.play((65 + trackCount));
    Serial.print(" 65 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 14) {
    myDFPlayer.play((70 + trackCount));
    Serial.print(" 70 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 15) {
    myDFPlayer.play((75 + trackCount));
    Serial.print(" 75 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 16) {
    myDFPlayer.play((80 + trackCount));
    Serial.print(" 80 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 17) {
    myDFPlayer.play((85 + trackCount));
    Serial.print(" 85 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 18) {
    myDFPlayer.play((90 + trackCount));
    Serial.print(" 90 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 19) {
    myDFPlayer.play((95 + trackCount));
    Serial.print(" 95 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 20) {
    myDFPlayer.play((100 + trackCount));
    Serial.print(" 100 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 21) {
    myDFPlayer.play((105 + trackCount));
    Serial.print(" 105 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 22) {
    myDFPlayer.play((110 + trackCount));
    Serial.print(" 110 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 23) {
    myDFPlayer.play((115 + trackCount));
    Serial.print(" 115 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 24) {
    myDFPlayer.play((120 + trackCount));
    Serial.print(" 120 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 25) {
    myDFPlayer.play((125 + trackCount));
    Serial.print(" 125 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 26) {
    myDFPlayer.play((130 + trackCount));
    Serial.print(" 130 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 27) {
    myDFPlayer.play((135 + trackCount));
    Serial.print(" 135 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 28) {
    myDFPlayer.play((140 + trackCount));
    Serial.print(" 140 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 29) {
    myDFPlayer.play((145 + trackCount));
    Serial.print(" 145 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 30) {
    myDFPlayer.play((150 + trackCount));
    Serial.print(" 150 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 31) {
    myDFPlayer.play((155 + trackCount));
    Serial.print(" 155 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 32) {
    myDFPlayer.play((160 + trackCount));
    Serial.print(" 160 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 33) {
    myDFPlayer.play((165 + trackCount));
    Serial.print(" 165 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 34) {
    myDFPlayer.play((170 + trackCount));
    Serial.print(" 170 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 35) {
    myDFPlayer.play((175 + trackCount));
    Serial.print(" 175 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 36) {
    myDFPlayer.play((180 + trackCount));
    Serial.print(" 180 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 37) {
    myDFPlayer.play((185 + trackCount));
    Serial.print(" 185 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 38) {
    myDFPlayer.play((190 + trackCount));
    Serial.print(" 190 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 39) {
    myDFPlayer.play((195 + trackCount));
    Serial.print(" 195 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 40) {
    myDFPlayer.play((200 + trackCount));
    Serial.print(" 200 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 41) {
    myDFPlayer.play((205 + trackCount));
    Serial.print(" 205 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 42) {
    myDFPlayer.play((210 + trackCount));
    Serial.print(" 210 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 43) {
    myDFPlayer.play((215 + trackCount));
    Serial.print(" 215 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 44) {
    myDFPlayer.play((220 + trackCount));
    Serial.print(" 220 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 45) {
    myDFPlayer.play((225 + trackCount));
    Serial.print(" 225 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 46) {
    myDFPlayer.play((230 + trackCount));
    Serial.print(" 230 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 47) {
    myDFPlayer.play((235 + trackCount));
    Serial.print(" 235 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 48) {
    myDFPlayer.play((240 + trackCount));
    Serial.print(" 240 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 49) {
    myDFPlayer.play((245+ trackCount));
    Serial.print(" 245 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 50) {
    myDFPlayer.play((250 + trackCount));
    Serial.print(" 250 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 51) {
    myDFPlayer.play((255 + trackCount));
    Serial.print(" 255 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 52) {
    myDFPlayer.play((260 + trackCount));
    Serial.print(" 260 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 53) {
    myDFPlayer.play((265 + trackCount));
    Serial.print(" 265 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 54) {
    myDFPlayer.play((270 + trackCount));
    Serial.print(" 270 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 55) {
    myDFPlayer.play((275 + trackCount));
    Serial.print(" 275 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 56) {
    myDFPlayer.play((280 + trackCount));
    Serial.print(" 280 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 57) {
    myDFPlayer.play((285 + trackCount));
    Serial.print(" 285 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 58) {
    myDFPlayer.play((290 + trackCount));
    Serial.print(" 290 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 59) {
    myDFPlayer.play((295 + trackCount));
    Serial.print(" 295 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 60) {
    myDFPlayer.play((300 + trackCount));
    Serial.print(" 300 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 61) {
    myDFPlayer.play((305 + trackCount));
    Serial.print(" 305 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 62) {
    myDFPlayer.play((310 + trackCount));
    Serial.print(" 310 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 63) {
    myDFPlayer.play((315 + trackCount));
    Serial.print(" 315 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 64) {
    myDFPlayer.play((320 + trackCount));
    Serial.print(" 320 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 65) {
    myDFPlayer.play((325 + trackCount));
    Serial.print(" 325 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 66) {
    myDFPlayer.play((330 + trackCount));
    Serial.print(" 330 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 67) {
    myDFPlayer.play((335 + trackCount));
    Serial.print(" 335 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 68) {
    myDFPlayer.play((340 + trackCount));
    Serial.print(" 340 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 69) {
    myDFPlayer.play((345 + trackCount));
    Serial.print(" 345 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 70) {
    myDFPlayer.play((350 + trackCount));
    Serial.print(" 350 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 71) {
    myDFPlayer.play((355 + trackCount));
    Serial.print(" 355 + ");
    Serial.print(trackCount);
  }
  else if (folderCount == 72) {
    myDFPlayer.play((360 + trackCount));
    Serial.print(" 360 + ");
    Serial.print(trackCount);
  }
  delay(50);
}

void printDetail(uint8_t type, int value){
  switch (type) {
    case TimeOut:
      Serial.println(F("Time Out!"));
      break;
    case WrongStack:
      Serial.println(F("Stack Wrong!"));
      break;
    case DFPlayerCardInserted:
      Serial.println(F("Card Inserted!"));
      break;
    case DFPlayerCardRemoved:
      Serial.println(F("Card Removed!"));
      break;
    case DFPlayerCardOnline:
      Serial.println(F("Card Online!"));
      break;
    case DFPlayerPlayFinished:
      Serial.print(F("Number:"));
      Serial.print(value);
      Serial.println(F(" Play Finished!"));
      break;
    case DFPlayerError:
      Serial.print(F("DFPlayerError:"));
      switch (value) {
        case Busy:
          Serial.println(F("Card not found"));
          break;
        case Sleeping:
          Serial.println(F("Sleeping"));
          break;
        case SerialWrongStack:
          Serial.println(F("Get Wrong Stack"));
          break;
        case CheckSumNotMatch:
          Serial.println(F("Check Sum Not Match"));
          break;
        case FileIndexOut:
          Serial.println(F("File Index Out of Bound"));
          break;
        case FileMismatch:
          Serial.println(F("Cannot Find File"));
          break;
        case Advertise:
          Serial.println(F("In Advertise"));
          break;
        default:
          break;
      }
      break;
    default:
      break;
  }
}

void serialEvent() {
  while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read();
    // add it to the inputString:
    inputString += inChar;
    // if the incoming character is a newline, set a flag so the main loop can
    // do something about it:
    if (inChar == '\n') {
      stringComplete = true;
    }
  }
}

void execute_CMD(byte CMD, byte Par1, byte Par2)
// Excecute the command and parameters
{
  // Calculate the checksum (2 bytes)
  word checksum = -(Version_Byte + Command_Length + CMD + Acknowledge + Par1 + Par2);
  // Build the command line
  byte Command_line[10] = { Start_Byte, Version_Byte, Command_Length, CMD, Acknowledge,
                            Par1, Par2, highByte(checksum), lowByte(checksum), End_Byte
                          };
  //Send the command line to the module
  for (byte k = 0; k < 10; k++)
  {
    mySoftwareSerial.write( Command_line[k]);
  }
}


 

 

  • Like 5
  • Thanks 1
  • Confused 1
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...